web-dev-qa-db-ja.com

2つの一致パターン間でファイルからコンテンツを抽出します(ファイルからHTMLのみを抽出します)

さまざまな種類のテキスト形式を含むファイルがあります。私の目標は、HTML部分のみを抽出し、このHTMLコードでファイルを作成することです。 grepまたはawkで可能だと思います。私のファイルには次のような行も含まれています:

Sender name `<[email protected]>`

このスクリプトを書いたcat file1.html | grep -E "<[^>]*>"。しかし問題は、行をSender nameなどとして出力することです。コンテンツを<html>タグの後にのみ抽出したいのです。だから、これは私にとって有用ではありません:

Return-Path: <[email protected]>
    for <test@localhost> (single-drop); Thu, 21 Sep 2017 18:34:07 +0400 (+04)
Return-path: <[email protected]>
    (envelope-from <[email protected]>)
References: <[email protected]>
From: test user <[email protected]>
X-Forwarded-Message-Id: <[email protected]>
Message-ID: <[email protected]>
In-Reply-To: <[email protected]>
2
DaviD

この目標は、ツールsed-テキストのフィルタリングおよび変換用のストリームエディターによって達成できます。短い答えは、以下のポイント5にあります。しかし、私は詳細な説明を書くことにしました。

0。まず、コマンドをテストするための簡単なファイルを作成しましょう:

$ printf '\nTop text\nSender <[email protected]>\n\n<html>\n\tThe inner text 1\n</html>\n\nMiddle text\n\n<HTML>\n\tThe inner text 2\n</HTML>\n\nBottom text\n' | tee example.file

Top text
Sender <[email protected]>

<html>
        The inner text 1
</html>

Middle text

<HTML>
        The inner text 2
</HTML>

Bottom text

1。この方法で、タグを含む<html></html>の間のすべてをトリミングできます。

$ sed -n -e '/<html>/,/<\/html>/p' example.file

<html>
        The inner text 1
</html>
  • オプション-e script--expression=script)は、実行するコマンドにスクリプトを追加します。この場合、追加されるスクリプトは'/<html>/,/<\/html>/p'です。スクリプトは1つしかありませんが、このオプションは省略できます。

  • オプション-n--quiet--silent)は、パターンスペースの自動印刷を抑制します。このオプションとともに、追加のコマンドを使用して、sedに何を印刷するかを指示する必要があります。

  • この追加コマンドは、スクリプトの最後に追加される印刷コマンドpです。 sed-nオプションで開始されなかった場合、pコマンドは入力を複製します。

  • 最後に、コンマで区切られた2つのパターン-/<html>/,/<\/html>/-で範囲を指定できます。ここで区切り文字の役割を果たす特殊文字\をエスケープするために/を使用していることに注意してください。

2。タグ<html></html>の間のすべてを、印刷せずにトリミングしたい場合は、追加する必要がありますコマンド:

$ sed -n '/<html>/,/<\/html>/{ /html>/d; p }' example.file

        The inner text 1
  • 中括弧{および}は、コマンドをグループ化するために使用されます。

  • コマンドdは、式html>に一致する各行を削除します。

3。しかし、example.fileには大文字の<HTML>タグもあります。したがって、パターンマッチでは大文字と小文字を区別しないようにする必要があります。フラグ/Iを正規表現に追加することにより、それを実現できます。

$ sed -n '/<html>/I,/<\/html>/I{ /html>/Id; p }' example.file

        The inner text 1
        The inner text 2
  • 正規表現の一致に対するI修飾子は、GNU拡張機能であり、大文字と小文字を区別しない方法でREGEXPが一致します。

4。<html>タグの間のすべてのHTMLタグを削除したい場合は、解析して「削除」するコマンドを追加できます。 <で始まり>で終わる文字列:

sed -n '/<html>/I,/<\/html>/I{ /html>/Id; s/<[^>]*>//g; p }' example.file
  • コマンドsは、式/<[^>]*>/に一致する文字列を、空の文字列//-s/<old>/<new>/に置き換えます。

  • パターンフラグgは、最初のものだけでなく、正規表現へのすべての一致に置換を適用します。

この場合、おそらくdeleteコマンドを省略したいと思うでしょう:

sed -n '/<html>/I,/<\/html>/I{ s/<[^>]*>//g; p }' example.file

5。ファイルの代わりに変更を行い、バックアップコピーを作成するには、オプション-iを使用するか、作成することができます>出力を新しいファイルにリダイレクトすることにより、sedの出力に基づく新しいファイル:

sed -n '/<html>/I,/<\/html>/I p' example.file -i.bak
sed -n '/<html>/I,/<\/html>/I p' example.file > new.file

参照:

6
pa4080