我有数百个写得很糟糕的 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'