首页 文章

为什么_605621的自动打印无法达到预期的效果?

提问于
浏览
1

什么有效

这个sed脚本按预期工作:

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

它一次需要一对输入线,并交换线 . 到现在为止还挺好 .

什么行不通

我不明白的是为什么我可以_605623的自动打印 . 由于sed会在每个执行周期结束时自动打印模式空间(除非它被抑制),为什么这不等同?

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

我认为代码说的是:

  • 输入行被复制到保留空间 .

  • 下一行被读入模式空间 .

  • 保留空间附加到模式空间 .

  • The pattern space (line1 + newline + line2) is printed automatically 因为我们已经到了执行周期的末尾 .

显然,我错了......但我不明白为什么 . 任何人都可以解释为什么第二个例子会破坏,为什么需要打印抑制来产生正确的结果?

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

相关问题