我正在使用 GNU sed 4.5 sed --version
。
我是 sed 的新手,我根据我的理解创建了以下 sed 的工作流程(如果您发现任何错误,请纠正我)。
因此,模式空间的默认自动打印似乎总是在末尾包含换行符。我的问题是,也会p
包含换行符吗?我有以下示例。
# seq 3 | sed -rn 'p'
1
2
3
这里,每个数字末尾的换行符都是由 sed 自己添加的(参见图“将换行符添加回模式空间”)。因此,它似乎p
不会添加换行符。但是,请参见下面的示例。
# seq 3 | sed -rn 'x;p;x;p'
1
2
3
这里x
将模式空间与保留空间交换,这将导致模式空间为空。现在p
应用于模式空间(其中没有任何内容)应该不打印任何内容。但根据结果,似乎这里p
打印了一个换行符。在我看来,这似乎是不一致的行为。有人能帮忙解释一下吗?
答案1
图表中有错误。将换行符添加回模式空间仅当 sed 未带该选项运行时才会发生-n
。因此正确的图表应该是:
以下是 sed 文档的摘录,网址为sed 的工作原理
当到达脚本末尾时,除非
-n
正在使用该选项,否则模式空间的内容将打印到输出流,如果删除了尾随换行符,则将其添加回来。然后下一个循环开始处理下一个输入行。
因此,如果我们使用 sed 运行-n
,则不会有添加换行符步。
sed 的文档指出该p
命令只是打印模式空间。请参阅常用命令了解详情。
页
打印出模式空间(到标准输出)。此命令通常仅与 -n 命令行选项一起使用。
但似乎总是p
会在模式空间的末尾添加一个换行符(如果您认为这是错误的,请纠正我)。
基于上述事实,让我们来看一些例子。
# seq 3 | sed -rn 'p'
1
2
3
本示例的流程如下:
- 读取文本
1<newline>
,剥离<newline>
并放入1
模式空间。 p
打印1
然后打印<newline>
- 读取文本
2<newline>
,剥离<newline>
并放入2
模式空间。 p
打印2
然后打印<newline>
- 读取文本
3<newline>
,剥离<newline>
并放入3
模式空间。 p
打印3
然后打印<newline>
对于第二个示例:
# seq 3 | sed -rn 'x;p;x;p'
1
2
3
该过程如下:
- 读取文本
1<newline>
,剥离<newline>
并放入1
模式空间。 - 放入
1
保持空间,并将空字符串放入模式空间。 - 打印空字符串,然后打印 a
<newline>
。 - 放回
1
模式空间并将空字符串放入保持空间。 - 打印
1
然后打印<newline>
- 对其他输入行重复步骤1~5
因此这些例子中并不存在矛盾。
顺便说一句,我还在学习 sed,这个答案是基于我的理解。如果你发现任何错误,请纠正我。谢谢。