sed-output中的命令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手册的描述,我的理解如下: 打印图案

在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手册的描述,我的理解如下:

  • 打印图案空间(第101行)
  • 将第201行附加到图案空间打印图案空间(第101行\n第201行)
  • 最多删除阵列空间中的第一个新行。模式 空间现在将有第201行
  • 现在sed手册说“并使用生成的模式空间重新启动循环,而不读取新的输入行”——这意味着返回到命令的开头?如果是这样的话,那么我们应该有一个输出-第201行,第201行\n第301行等等,在循环中直到结束

  • 但这不是我看到的结果

    我想答案已经包含在@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命令增加行计数器”。这就是原因