【问题标题】:can't get to understand the 'n' command of sed无法理解 sed 的“n”命令
【发布时间】:2014-12-13 20:50:23
【问题描述】:

我正在尝试了解 sed 的“n”命令是如何运作的。

我在 Mac OS X 上,所以它是来自 BSD 的 sed

让我们考虑这个例子:

$ 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”命令将模式空间写入标准输出(打印 1),因为默认输出没有被“-n”选项抑制
  • “p”命令打印整个模式空间(再次打印 1)
  • 打印默认输出(再次打印1)

第二个周期:

  • 模式空间被清除
  • 第 2 行被读取为模式空间 (2) 中的输入
  • 然后“n”命令将模式空间写入标准输出(打印 2)
  • “p”命令在标准输出中打印整个模式空间(再次打印 2)
  • 打印默认输出(再次打印2)

等等

我还找到了关于 (GNU ?) sed 的 this 教程,但我也没有帮助我理解这个命令行是如何工作的(“修改输出流”列中的“*”是什么意思? )

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

【问题讨论】:

    标签: macos bash sed gnu bsd


    【解决方案1】:

    这可能对你有用:

    比较:

    sed -ne 'n;p' file
    

    到:

    sed -e 'n;p' file
    

    【讨论】:

    • 没有什么可以“工作”的。我只是想了解它的功能。
    • "work" 在这种情况下意味着推动你的理解。也许您应该从没有命令开始,然后一次添加一个命令并比较结果。注意。没有命令意味着sed '' file
    • 相信我,我已经尝试过添加命令并与其他人组合。
    【解决方案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”;

    Sed 现在再次重复上述步骤。读取“3”,打印它,然后读取“4”并打印两次,等等。

    例如,如果您使用了

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

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

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

    这有帮助吗?

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

    【讨论】:

    • 谢谢布鲁斯,非常清楚!我现在明白为什么 'n' 实际上并没有“修改”模式空间,因为它只是强制 sed 读取下一行。所以实际上是 sed 正在修改模式空间。这就是与 N 的区别,它需要修改模式空间以保留第一个读取行及其后续行。
    • 是的,'N' 将下一行附加到当前模式空间中,因此您可以执行将 2 行合并为 1 等操作。包含 '\n',因此您可以使用它作为替换中的“标记”。
    猜你喜欢
    • 2022-07-05
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 2010-10-14
    • 1970-01-01
    相关资源
    最近更新 更多