如何让 sed 删除文件中的第二行块?

如何让 sed 删除文件中的第二行块?

我有数百个写得很糟糕的 HTML 文件,它们有两个 HTML 部分,如下所示:

<HTML>
<HEAD>
several header lines
</HEAD>
<BODY>
hundreds of lines of content
</BODY>
</HTML>
<HTML>
dozens of lines
</HTML>

我想在 Linux 上使用 GNU sed 4.7 删除整个第二个 HTML 部分。我尝试过类似的事情:

sed '0,/<HTML>/! /<HTML>/,/<\/HTML>/d'

但这行不通。我想做这样的事情,但它在语法上不正确:

sed '/<HTML>/2,/<\/HTML>/d'

请帮助。

答案1

假设该文件是格式良好的 XML 文档,您可以用来xmlstarlet重新格式化该文档。使用该--recover选项执行此操作将使实用程序输出第一个顶级标签及其所有内容,但会丢弃任何其他顶级标签。

例子:

$ xmlstarlet fo --recover --omit-decl --noindent file >newfile
file:9.1: Extra content at the end of the document
<HTML>
^
$ cat newfile
<HTML>
<HEAD>
several header lines
</HEAD>
<BODY>
hundreds of lines of content
</BODY>
</HTML>

答案2

相同的想法@FelixJN 的回答但在每个 UNIX 机器上的任何 shell 中使用任何 awk:

$ awk '{print}; /<\/HTML>/{exit}' file
<HTML>
<HEAD>
several header lines
</HEAD>
<BODY>
hundreds of lines of content
</BODY>
</HTML>

awk -i inplace 'script' *如果您想一次对所有文件进行“就地”编辑并使用 GNU awk,请使用它。

答案3

只要反过来:打印所有行,但在第一次出现时退出</HTML>

sed -ni 'p;/<\/HTML>/q' file

-i无需先测试即可使用。

或者更简单的方法:

sed -i '/<\/HTML>/q'

相关内容