为什么sed的自动打印没有达到预期的效果?

时间:2012-06-29 14:20:13

标签: sed

什么有用

此sed脚本按预期工作:

$ echo -e "2\n1\n4\n3" | sed -n 'h; n; G; p'
1
2
3
4

一次需要一对输入线,并交换线。到目前为止,非常好。

什么不起作用

了解的原因是我无法使用sed的自动打印。由于sed会在每个执行周期结束时自动打印模式空间(除非它被抑制),为什么这不等同?

$ echo -e "2\n1\n4\n3" | sed 'h; n; G'
2
1
2
4
3
4

我认为代码所说的是:

  1. 输入行将复制到保留空间。
  2. 下一行读入模式空间。
  3. 保留空间附加到图案空间。
  4. 模式空间(line1 +换行符+换行符2)会自动打印,因为我们已经到了执行周期的末尾。
  5. 显然,我错了......但我不明白为什么。任何人都可以解释为什么第二个例子会破坏,为什么需要打印抑制来产生正确的结果?

2 个答案:

答案 0 :(得分:2)

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>.

答案 1 :(得分:0)

这可能对您有用:

echo -e "2\n1\n4\n3" | sed 'h;N;s/.*\n//;G'
1
2
3
4

或者这个(GNU sed):

echo -e "2\n1\n4\n3" | sed '1~2{h;d};2~2G'
1
2
3
4

要了解要打印的内容,请使用l或使用GNU l0