【发布时间】: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' 修改过?
【问题讨论】: