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は処理を始める前にファイル全体をメモリーへ読み込む必要があります。そのため、一部の大きなファイルではメモリーを使い切って失敗します。
- UTF-8ロケールでも、PerlがデータをUTF-8として扱うのは特定の条件を満たす場合だけです。たとえば、