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

问题描述 投票:3回答:1

在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等输出,直到循环结束。

但是那不是我看到的输出。

sed
1个回答
0
投票

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

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.