Gnu sed,p 命令在打印时会附加换行符吗?

Gnu sed,p 命令在打印时会附加换行符吗?

我正在使用 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. 读取文本1<newline>,剥离<newline>并放入1模式空间。
  2. p打印1然后打印<newline>
  3. 读取文本2<newline>,剥离<newline>并放入2模式空间。
  4. p打印2然后打印<newline>
  5. 读取文本3<newline>,剥离<newline>并放入3模式空间。
  6. p打印3然后打印<newline>

对于第二个示例:

# seq 3 | sed -rn 'x;p;x;p'

1

2

3

该过程如下:

  1. 读取文本1<newline>,剥离<newline>并放入1模式空间。
  2. 放入1保持空间,并将空字符串放入模式空间。
  3. 打印空字符串,然后打印 a <newline>
  4. 放回1模式空间并将空字符串放入保持空间。
  5. 打印1然后打印<newline>
  6. 对其他输入行重复步骤1~5

因此这些例子中并不存在矛盾。

顺便说一句,我还在学习 sed,这个答案是基于我的理解。如果你发现任何错误,请纠正我。谢谢。

相关内容