使用 POSIX sed 連接行
我正在嘗試使用 POSIX sed 加入行。
使用 GNU sed(沒有 –posix)可以按預期工作:
$ sed ':a; N; s/\n//; b a' <<< $'a\nb\nc' abc
但是如果我使用 –posix 我沒有輸出。
為什麼會這樣,否則我該怎麼做?
這是一份工作
paste
:printf '%s\n' a b c | paste -sd '\0' -
(不,這不是與 NUL 連接,而是按照 POSIX 的要求不使用分隔符連接。一些
paste
實現也支持paste -sd '' -
,但這既不是標準的也不是可移植的)。請注意,除了在busybox實現中,如果輸入為空,它會產生一個空行作為輸出(不幸的是,一個歷史錯誤/錯誤功能現在刻在POSIX規範中)。
使用 POSIX
sed
:sed -e :a -e '$!{N;ba' -e '}' -e 's/\n//g'
或者:
sed ' :a $!{ N ba } s/\n//g'
、
b
和命令後面不能跟另一個命令:
。}
在早期版本的 POSIX 規範中,b a;s/a/b/
需要b
分支到名為 的標籤a;s/a/b/
,在較新版本的規範中,它現在未指定,以允許 GNUsed
行為。以下命令必須在後續表達式中或單獨的行中。POSIX 還要求
N
在最後一行退出而不列印模式空間。GNUsed
僅在 POSIX 模式下執行此操作,例如當POSIXLY_CORRECT
環境中有變數或使用您的--posix
選項時,這解釋了為什麼使用--posix
.另請注意,POSIX 保證的模式空間的最小大小為 8192 字節。您只能將這種方法用於非常小的文件。
paste
沒有大小限制,與sed
方法相反,不需要在列印之前將整個文件載入到記憶體中。另一種方法是
tr -d '\n'
. 但是請注意,與paste
/相反sed
,它會在輸出上產生一個非定界行(輸出abc
而不是abc\n
上面的範例)。在任何情況下,
<<<
是一個zsh
運算符(現在被其他一些 shell 支持),並且$'...'
是一個 ksh93 運算符(現在被大多數其他類似 POSIX 的 shell 支持),也不是 POSIXsh
運算符(儘管後者很可能被添加到下一個標準的主要修訂版),因此不應在 POSIXsh
腳本中使用。