sed-output中的命令D似乎与手册中所说的不同
在sed手册中找到关于命令D的以下内容 D-如果模式空间不包含换行符,则开始正常的新循环,就像发出了D命令一样。否则,删除模式空间中直到第一个换行的文本,并使用生成的模式空间重新开始循环,而不读取新的输入行 但我尝试的示例似乎与上面描述的不匹配sed-output中的命令D似乎与手册中所说的不同,sed,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手册的描述,我的理解如下: 打印图案
$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手册的描述,我的理解如下:
但这不是我看到的结果 我想答案已经包含在@poton的评论中了 关于OP对sed的行为感到惊讶的原因,我只能推测这是由于他第2点的措辞: 将第201行附加到图案空间打印图案空间(第101行 \(第201行) 这给以下错误解释留下了空间:
N
拾取下一行输入并将其附加到当前
图案空间(中间有一条换行线);那么,当
到达脚本时,读取下一行相同的输入
这意味着第201行将被处理两次。相反,它只被处理一次,因为
N
读取输入的新行,并将其附加到模式空间的内容中。不完全清楚您期望的输出是什么,但您使用的是“N”选项,该选项将抑制所有输出,除了第一个周期,当你明确要求时。在你的例子中有4行。循环结束时自动打印一行被关闭(-n
),并且命令被地址1
限制在第一行。第一行打印(p
),第二行追加(N
)。再次打印第1行和第2行(p
),并删除第一行。由于当前行号现在为2或更多,因此不进行进一步处理。顺便说一句,-r
选项是不必要的,因为不存在regexp。我特意打开了-n标志以抑制默认回音。我的观点是,输出与手册页所说的D不匹配,“删除模式空间中的文本直到第一个换行,并使用结果模式空间重新启动循环,而不读取新的输入行”。因为它显然没有读取新的输入行,所以{}不应该使它停止。我在测试的时候就把-r放在那里了。在一些代码中看到了D的用法,我正在查看工作,想知道D到底是如何工作的。尽管模式空间仍然包含行201
,但处理仅限于加法/行号1。关闭自动打印后,将不再进行打印。尝试删除第1行地址,即sed-n'p;NPD'文件
。这将打印第1行、第1行和第2行、第2行和第3行、第3行、第3行和第4行、第4行,然后N
将尝试读取eof并终止。我得到了答案……在Daniel Goldman关于sed的书中看到了这一点。“sed维护一个行计数器…n和n命令增加行计数器”。这就是原因