viu*_*ser 7 bsd sed gnu newlines
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$
Run Code Online (Sandbox Code Playgroud)
虽然 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
Run Code Online (Sandbox Code Playgroud)
我们如何解释这种行为差异?
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
Run Code Online (Sandbox Code Playgroud)
(注意没有提到换行符)。
sed
但是,GNU在字符集中包含换行符以明确显示。它这样做是作为POSIX 标准sed
提及的字符集(这是 BSDsed
使用的集)的扩展。sed
即使--posix
在命令行上使用GNU也是如此。
GNUsed
也输出10
两次,而 BSDsed
没有。sed
使用POSIXLY_CORRECT
set 或 with运行 GNU--posix
将10
只输出一次,就像 BSDsed
那样。
这是因为sed
默认情况下GNU 会忽略该sed
N
命令的 POSIX 定义部分
如果没有可用的下一行输入,则
N
命令动词应分支到脚本的末尾并退出而不开始新的循环或将模式空间复制到标准输出。
还要注意的是,p
在你的sed
程序不会被执行,因为D
开始一个新的循环。