ファイルから2番目の行ブロックを削除するようにsedを取得するにはどうすればよいですか?

ファイルから2番目の行ブロックを削除するようにsedを取得するにはどうすればよいですか?

次の 2 つの 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を使用して2番目の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>

おすすめ記事