sed中的命令D-输出似乎与手册中所说的不同

时间:2019-06-23 16:32:56

标签: sed

在sed手册中找到有关命令D的以下内容,

D -如果模式空间不包含换行符,请像发出d命令一样开始正常的新循环。否则,删除模式空间中的文本直到第一行,然后重新启动具有结果模式空间的循环,而无需读取新的输入行

但是我尝试的示例似乎与上述内容不符。

$cat test
LINE 101
LINE 201
LINE 301
LINE 401

$ sed -nr '1{p;N;p;D;}' test
LINE 101
LINE 101
LINE 201

根据sed手册说明,我理解的方式如下,

  1. 打印图案空间(第101行)
  2. 将LINE 201附加到图案空间以打印图案空间(LINE 101 \ n LINE 201)
  3. 删除到模式空间中的第一行。模式 现在空间将有LINE 201
  4. 现在sed手册说:“并使用生成的模式空间重新启动循环,而无需读取新的输入行”-这意味着要返回命令的开头吗?如果是这样,那么我们应该有-LINE 201,LINE 201 \ n LINE 301等输出,直到循环结束。

但这不是我看到的输出。

1 个答案:

答案 0 :(得分:0)

我认为答案已经包含在@potong的评论中。

关于OP为什么sed的行为感到惊讶,我只能推测这是由于他的观点2的措辞造成的:

  

将LINE 201附加到图案空间以打印图案空间(LINE 101   \ n LINE 201)

为以下错误解释留出空间:

  

N 插入输入的下一行并将其附加到当前行   模式空间(中间有换行符);然后,当结束   到达脚本,下一行输入相同的是 read

这意味着LINE 201被处理了两次。相反,它仅处理一次,因为N 读取输入的新行并将其附加到模式空间的内容。