正規表現でファイルから複数行を取得するには?

正規表現でファイルから複数行を取得するには?

正規表現でファイルから複数行を取得するには?

私はしばしば正規表現を介して複数行を取得または修正したいと思います。実例:

XML/SGML ファイルの一部を読み取ろうとしています。形式が正しい構文であるか予測可能な構文である必要はないため、正規表現は適切なパーサーよりも安全です。また、これを完全に実行できることを願っています。いくつかのキーワードのみが知られているシェルスクリプト(SolarisとLinuxで実行されている非構造化ファイル)から。

XMLの例:

<tag1>
 <tag2>bar</tag2>
</tag1>
<tag1>
 <tag2>foo</tag2>
</tag1>

<tag1>ここでどこかに含まれているか読んでみたいですfoo

このような正規表現は(<tag1>.*?foo.*?</tag1>)正しい部分を提供する必要がありますが、grep同じツールはsed1行でのみ機能します。どうやって入手できますか?

<tag1>
 <tag2>foo</tag2>
</tag1>

この場合?

ベストアンサー1

GNU grepがインストールされている場合-P(perl-regex)フラグを渡して有効にすることで、PCRE_DOTALL複数行の検索を実行できます。(?s)

grep -oP '(?s)<tag1>(?:(?!tag1).)*?foo(?:(?!tag1).)*?</tag1>' file.txt
<tag1>
<tag2>foo</tag2>
</tag1>

上記の方法がプラットフォームで機能しない場合は、-zgrepがNULを行区切り文字として処理して、ファイル全体が1行のように見えるようにするフラグを追加してみてください。

grep -ozP '(?s)<tag1>(?:(?!tag1).)*?foo(?:(?!tag1).)*?</tag1>' file.txt

おすすめ記事