Sed

BSD sed 與 gsed 中的換行符

  • March 30, 2019

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用於以視覺明確的形式輸出字元sedl,不會以視覺明確的形式輸出換行符。

來自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

(注意沒有提到換行符)。

然而, GNUsed在字元集中包含換行符以明確顯示。它是作為POSIX 標準sed提到的字元集的擴展(這是 BSDsed使用的字元集)。sed即使--posix在命令行上使用GNU也會以這種方式執行。

GNUsed也輸出10兩次,而 BSDsed沒有。sed使用POSIXLY_CORRECTset 或 with執行 GNU--posix將使其10只輸出一次,就像 BSDsed一樣。

這是因為 GNU預設忽略命令sed的 POSIX 定義部分sed N

如果沒有可用的下一行輸入,N命令動詞將跳轉到腳本的末尾並退出,而不開始新的循環或將模式空間複製到標準輸出。

另請注意,p您的sed程序中的 永遠不會執行,因為它會D開始一個新的循環。

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