什么有效
此 sed 脚本按预期工作:
$ echo -e "2n1n4n3" | sed -n 'h; n; G; p'
1
2
3
4
它一次需要一对输入线,并交换线。目前为止,一切都好。
什么不起作用
我不明白的是为什么我不能使用 sed 的自动打印。既然 sed 在每个执行周期结束时自动打印模式空间(除非它被抑制),为什么这不等效?
$ echo -e "2n1n4n3" | sed 'h; n; G'
2
1
2
4
3
4
我认为代码说的是:
- 输入行将复制到保留空间。
- 下一行被读入模式空间。
- 保留空间将追加到模式空间。
- 模式空间(line1 + 换行符 + line2)是自动打印的,因为我们已经到达了执行周期的终点。
显然,我错了...但我不明白为什么。谁能解释为什么第二个示例会中断,以及为什么需要打印抑制才能产生正确的结果?
n
命令使 sed 在读取下一行之前打印当前缓冲区。 这是 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/sed.html 的描述
[2addr]n
Write the pattern space to standard output if the default
output has not been suppressed, and replace the pattern
space with the next line of input, less its terminating <newline>.
这可能
对你有用:
echo -e "2n1n4n3" | sed 'h;N;s/.*n//;G'
1
2
3
4
或这个(GNU sed):
echo -e "2n1n4n3" | sed '1~2{h;d};2~2G'
1
2
3
4
要了解将打印的内容,请使用l
或者您是否正在使用 GNU l0