我使用的是GNU 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
打印了一个换行符。在我看来,这似乎是不一致的行为。有人能帮我解释一下吗?
发布于 2019-01-08 08:33:54
图中有一个错误。将换行符添加回模式空间时,只有在没有-n
选项的情况下运行sed时才会发生。因此,正确的图表应该是:
下面是sed是如何工作的上sed文档的摘录
当到达脚本的末尾时,除非使用
-n
选项,否则模式空间的内容将打印到输出流中,如果移除,则将其添加回尾随换行符。然后,下一个循环开始下一个输入行。
因此,如果我们使用-n
运行sed,就不会有添加换行符的退一步。
sed的文档声明,p
命令只是打印模式空间。详情请参见经常使用的命令。
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
放在持有空间中,并在模式空间中放置空字符串。<newline>
。1
放回模式空间,并将空字符串放入持有空间。1
,然后打印<newline>
因此,这些例子没有不一致之处。
顺便说一句,我还在学习sed,这个答案是基于我的理解。如果你发现有什么问题,请纠正我。谢谢。
https://askubuntu.com/questions/1108018
复制