Sed
BSD sed 與 gsed 中的換行符
FreeBSD 11.2 p7 附帶的 sed 提供:
$ seq 10 | sed 'N; l; D; p' 1$ 2$ 2$ 3$ 3$ 4$ 4$ 5$ 5$ 6$ 6$ 7$ 7$ 8$ 8$ 9$ 9$ 10$
雖然 gsed (GNU sed 4.7) 給出了相同的腳本:
$ seq 10 | gsed 'N; l; D; p' 1\n2$ 2\n3$ 3\n4$ 4\n5$ 5\n6$ 6\n7$ 7\n8$ 8\n9$ 9\n10$ 10
我們如何解釋這種行為差異?
BSD用於以視覺明確的形式輸出字元
sed
時l
,不會以視覺明確的形式輸出換行符。來自OpenBSD 上的sed(1) :
[2addr]l (The letter ell.) Write the pattern space to the standard output in a visually unambiguous form. This form is as follows: backslash \\ alert \a backspace \b form-feed \f carriage-return \r tab \t vertical tab \v
(注意沒有提到換行符)。
然而, GNU
sed
在字元集中包含換行符以明確顯示。它是作為POSIX 標準sed
提到的字元集的擴展(這是 BSDsed
使用的字元集)。sed
即使--posix
在命令行上使用GNU也會以這種方式執行。GNU
sed
也輸出10
兩次,而 BSDsed
沒有。sed
使用POSIXLY_CORRECT
set 或 with執行 GNU--posix
將使其10
只輸出一次,就像 BSDsed
一樣。這是因為 GNU預設忽略命令
sed
的 POSIX 定義部分sed
N
如果沒有可用的下一行輸入,
N
命令動詞將跳轉到腳本的末尾並退出,而不開始新的循環或將模式空間複製到標準輸出。另請注意,
p
您的sed
程序中的 永遠不會執行,因為它會D
開始一個新的循環。