我试图复制在这里找到的示例: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/