为什么 sed 的自动打印不能提供预期的结果?

  • 本文关键字:结果 不能 打印 sed sed
  • 更新时间 :
  • 英文 :


什么有效

此 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

我认为代码说的是:

  1. 输入行将复制到保留空间。
  2. 下一行被读入模式空间。
  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

最新更新