ウェブサイト検索

grepを使用して複数行にわたるパターンマッチを見つける方法


grep は、ファイルや他の種類の入力の中でパターンや文字列を見つけることができるコマンドラインのテキスト検索ユーティリティです。ほとんどの一致は1行だけに適合しますが、複数の改行にまたがる一致を見つけることもしばしば役立ちます。

grepを使用した複数の改行にわたるマッチング

複数行の一致を処理するのはgrepが苦手とすることです。この仕事に適したより良いツールは

awk

または

sed

, どちらもマルチラインの入力を自然に扱います。コンマで区切られた2つの式を使用すると、それら2つのパターンの間のすべてに一致します。

awk '/from/,/to/' file

sed -n '/from/,/to/p' file

これをgrepで処理することはまだ可能ですが、コマンドは非常に扱いにくいです。

grep -Pz '(?s)from.*n.*to' test

これにはいくつかのことがあります。

  • -P パール互換の正規表現を有効にします。
  • -zはファイル全体を1行として読み込み、「ゼロバイト」を改行の代わりに使用します。これにより、grepは全体を1行として処理できます。
  • (?s)はPCRE_DOTALLをオンにし、これにより「.」(ドット)文字が改行を含む任意の文字と一致するようになります。
  • from は出発の試合です。
  • .*n.* は、to までのすべての内容に一致し、それが終了の一致となります。

全体的に見て、これでスクリプトの目的は達成されますが、自分でこれを入力する場合はかなりの量を覚えておく必要があります。また、-oフラグを使用してマッチだけを印刷すると、トレイリングゼロバイト文字も印刷されるため、追加の問題を引き起こす可能性があります。

pcre2grepの代わりに使用する(Perl互換のgrep)

通常のgrepはこの作業に最適なツールではなく、pcre2grepという代替手段があり、これはデフォルトでPerl互換正規表現のサポートを備えており、マルチラインの正規表現を非常に簡単に一致させることができます。

おそらくあなたのシステムにインストールされていますが、もしインストールされていない場合は、パッケージマネージャーから入手できます。

sudo apt install pcre2-utils

次に、-Mパラメータを使って実行するだけです。

pcre2grep -M 'from(n|.)*to' file

これはまだ「改行または任意の文字」を手動で(n|.)*と一致させる必要があることに注意してください。代わりに、(?s)トリックを使ってPCRE_DOTALLを有効にし、ドット文字が改行にも一致するようにすることができます。

pcre2grep -M '(?s)from.*to' file

関連記事: