このページの内容

2.4 grepプログラム

grepは、指定された入力ファイルから、与えられたパターンに一致する部分を含む行を検索します。既定では、grepは一致行を表示します。-というファイル名は標準入力を表します。入力を指定しない場合、再帰検索を指定するコマンドラインオプションがあるときは、grepは作業ディレクトリー.を検索します。それ以外ではgrepは標準入力を検索します。grepには、次のオプションで制御する4つの主な種類があります。

-G
--basic-regexp

パターンを基本正規表現(BRE)として解釈します。これが既定の動作です。

-E
--extended-regexp

パターンを拡張正規表現(ERE)として解釈します。(-EはPOSIXで定められています。)

-F
--fixed-strings

パターンを正規表現ではなく固定文字列として解釈します。(-FはPOSIXで定められています。)

-P
--perl-regexp

パターンをPerl互換正規表現(PCRE)として解釈します。

文書はhttps://www.pcre.org/を参照してください。ただし、次の点に注意してください。

  • UTF-8ロケールでも、PerlがデータをUTF-8として扱うのは特定の条件を満たす場合だけです。たとえば、perlを-Cオプション付きで起動した場合や、環境変数PERL_UNICODEを適切に設定した場合です。同様に、pcre2grepも-uまたは-Uを指定して起動した場合だけUTF-8として扱います。一方、UTF-8ロケールでは、grepとgit grepは常にデータをUTF-8として扱います。
  • Perlとgit grep -Pでは、「\d」はASCII以外も含むすべてのUnicode数字に一致します。たとえば、「\d」は「٣」(U+0663 ARABIC-INDIC DIGIT THREE)に一致します。一方、「grep -P」では、ロケールにかかわらず、「\d」はASCIIの10個の数字だけに一致します。pcre2grepの「\d」は通常、Perlやgit grep -Pと同じように動作しますが、--posix-digitを指定すると「grep -P」と同じように動作します。(すべてのプラットフォームで、「\D」は「\d」の補集合に一致します。)
  • パターン「[[:digit:]]」は、Perl、「grep -P」、git grep -P、pcre2grepのいずれでも、すべてのUnicode数字に一致します。そのため、これらのプラットフォームでPerlの「\d」と同じ効果を得るために使えます。つまり、Perlとgit grep -Pでは「\d」は「[[:digit:]]」と同じですが、「grep -P」では「\d」は「[0-9]」と同じです。pcre2grepは通常Perlに従いますが、--posix-digitを指定すると「grep -P」に従います。

    (これらすべてのプラットフォームで、「[[:digit:]]」は「\p{Nd}」および「\p{General_Category: Decimal_Number}」と同じです。)

  • grepをPCRE2バージョン10.43(2024年)以降と組み合わせてビルドした場合、「(?aD)」を指定すると「\d」は「[0-9]」と同じように動作し、「(?-aD)」を指定すると「[[:digit:]]」と同じように動作します。
  • PCREはPerl正規表現の構文と意味に追従していますが、常に完全に一致するわけではありません。Perlは進化しており、同じホストにあるPerl環境がPCRE2環境より古かったり新しかったりすることがあります。また、両者のUnicodeのバージョンが異なる場合や、特殊な構文の扱いについてPerlとPCRE2が異なる場合もあります。
  • 既定では、grepは各正規表現を1行ずつ適用するため、「.」を改行にも一致させる「(?s)」指定は、通常効果がありません。ただし、-z(--null-data)を使うと機能する場合があります。
    $ printf 'a\nb\n' |grep -zP '(?s)a.b'
    a
    b
    

    ただし注意してください。-z(--null-data)を使い、ファイルにNULバイトが含まれていない場合、grepは処理を始める前にファイル全体をメモリーへ読み込む必要があります。そのため、一部の大きなファイルではメモリーを使い切って失敗します。