如何用sed删除文件中指定标签段落及后续行?
用sed删除指定标签段落及后续行的解决方法
问题场景
现有文件内容如下:
-- -- <tag1> -- some text -- </tag1> -- -- <tag2> -- </tag2> -- -- <tag3> -- other stuff -- </tag3> --
需要删除<tag2>对应的整个段落,以及该段落之后的一行(即单独的--行),最终得到:
-- -- <tag1> -- some text -- </tag1> -- -- <tag3> -- other stuff -- </tag3> --
尝试过的无效方法
sed -e '/<tag2>/,/<\/tag2>/d' file:仅能删除<tag2>到</tag2>的内容,无法删除后续的--行。sed -e '/<tag2>/,/<\/tag2>/{N;d}' file:仅对包含内容的标签段落生效,对空内容的<tag2>段落无效。
正确实现命令
sed -e '/<tag2>/{:loop; N; /<\/tag2>\n/!b loop; N; d;}' file
命令解释
- 当匹配到包含
<tag2>的行时,进入自定义循环loop: N:将下一行追加到当前缓冲区中;/<\/tag2>\n/!b loop:如果缓冲区末尾还没匹配到</tag2>加换行符(即还没读到</tag2>行),就回到循环开头继续读取下一行;- 当读到
</tag2>行后,再执行一次N读取后续的那一行(即目标删除的--行); d:删除当前缓冲区中的所有内容(也就是<tag2>段落+后续行)。
这个命令不管<tag2>段落内是否有内容,都能精准删除目标区块及后续行。
内容的提问来源于stack exchange,提问作者JohnR
相关产品推荐
相关产品推荐

