无法理解sed的'n'命令

时间:2014-10-18 11:10:59

标签: macos bash sed gnu bsd

我试图了解sed的'n'命令是如何运作的。

我使用的是Mac OS X,因此它来自BSD

让我们考虑这个例子:

$ seq 5 | sed -e 'n;p'
1
2
2
3
4
4
5

根据Apple manpage here(参见下面的引文)和我的理解,输出应该是这样的:

1
1
1
2
2
2
3
3
3
4
4
4
5
5
5

关于sed的Apple手册页:

  

[2addr] n的

     

如果未抑制默认输出,则将模式空间写入标准输出,   并用下一行输入替换模式空间。

我期望sed如何管理这个:

第一个周期:

  • 第1行在模式空间(1)
  • 中被读取为输入
  • 然后'n'命令在stdout中写入模式空间(打印1),因为默认输出没有被'-n'选项抑制
  • 'p'命令打印整个图案空间(再次打印1个)
  • 打印默认输出(再次打印1次)

第二个周期:

  • 模式空间已清除
  • 第2行被读作模式空间(2)
  • 中的输入
  • 然后'n'命令在stdout中写入模式空间(打印2)
  • 'p'命令在stdout中打印整个模式空间(再次打印2个)
  • 打印默认输出(再次打印2次)

我还在(GNU?)sed上找到了this教程,但是我没有帮助我理解这个命令行是如何工作的('*'在“修改为输出流”中意味着什么专栏?)

有人可以一步一步向我解释一下是怎么回事吗?为什么有些数字只打印一次?默认输出是否替换为在stdout中写入模式空间的'n'第一个函数?模式空间是否真的被'n'修改过?

2 个答案:

答案 0 :(得分:2)

感谢您参考我的sed教程,该教程是为最初的AT& T / Sun sed编写的。我会尽力使用各种扩展和变体来保持最新状态,例如: G。 GNU sed。

不要忘记,'n'命令将下一行读入模式空间,该模式空间“刷新”现有模式空间。 'N“命令不会”刷新“,但会附加模式空间。

以下是'n; p'命令

的情况
  1. 读取下一行(在本例中为第一行)(包含“1”,并将其放入模式空间。
  2. 执行'n'命令,它执行默认设置,在这种情况下打印模式空间,即“1”,执行'n',读取下一行,所以现在“2”在模式空间,没有别的。
  3. 执行“p”命令,打印模式空间“2”
  4. 执行完所有命令后,sed执行默认设置,打印模式空间(再次),“2”;
  5. Sed现在再次重复上述步骤。其中读入“3”,打印出来,然后读入“4”并打印两次,等等。

    例如,如果您使用

    seq 10 | sed -n -e 'n;p'
    

    然后sed将打印每隔一行。也就是说,

    1. 将下一行读入模式空间,例如“1”
    2. 执行'n'命令,将“2”放入模式空间
    3. 执行打印“2”
    4. 的'p'命令
    5. 完成命令,现在再次循环,将读入“3”,然后读取“4”,并打印“4”等。
    6. 这有帮助吗?

      当我提到“修改输出”时,它取决于是否使用了'-n'命令行选项。请参见该图表的底部。

答案 1 :(得分:-1)

这可能对您有用:

比较

sed -ne 'n;p' file

为:

sed -e 'n;p' file