我试图复制在这里找到的示例:http://www.grymoire.com/Unix/Sed.html#uh-35a

这是sed模式

/^begin$/,/^end$/{
    /begin/n
    /end/!d
}

这是第一个文件
begin
one
end
last line

这是第二个
begin
end
last line

当我在第一个文件上运行sed时,它将删除开始/结束之间的所有内容,一切正常。当我第二次运行它时,它似乎错过了“结束”并删除了文件的其余部分。

在第一个文件上运行
$ sed -f x.sed a
begin
end
last line

秒跑
$ sed -f x.sed b
begin
end

请注意在第二次运行中缺少“最后一行”。

我以为“n”会打印当前模式并吸引下一个模式。然后它将命中/ end /命令并进行处理。

实际上,它似乎以某种方式导致错过了范围的尽头。有人可以解释发生了什么吗?

最佳答案

它应该是:

/^begin$/,/^end$/{
    /^begin$\|^end$/!d
}

你的命令为什么错了?
n命令在那里错误。在第二个示例中,它将:
  • begin ---> n读取下一行(重要:,这不影响范围地址的状态(开始,结束))

    1a。 end ---> /end/!不适用。不要删除
  • last line ---> /end/!适用。删除行。 (sed仍在搜索包含end的行,因为n命令跳过了该行)
  • 关于sed - sed n似乎不以我认为的方式工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33903711/

    10-12 00:27
    查看更多