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) :
(注意没有提到换行符)。
然而, 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
另请注意,
p
您的sed
程序中的 永远不会执行,因为它会D
开始一个新的循环。