Sed

使用 POSIX sed 連接行

  • February 28, 2020

我正在嘗試使用 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腳本中使用。

引用自:https://unix.stackexchange.com/questions/569153