1

什么有效

此 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 + newline + line2) 会自动打印,因为我们已经到了执行周期的末尾。

显然,我错了……但我不明白为什么。谁能解释为什么第二个示例会中断,以及为什么需要打印抑制才能产生正确的结果?

4

2 回答 2

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>.
于 2012-06-29T14:24:49.647 回答
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或您是否使用 GNUl0

于 2012-06-30T21:10:18.797 回答