
次の 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>
答え2
同じ考え@FelixJNからの返信ただし、すべてのUNIXシステムのすべてのシェルで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'