grep ではどの正規表現標準が使用されていますか?

grep ではどの正規表現標準が使用されていますか?

grepで使用される正規表現の標準ですPOSIX + ASCIIそれとも何か他のものが混ざっているのでしょうか?

答え1

それはすべて、grep に渡すフラグによって決まります。

通常のフラグなし grep (-G を渡すのと同じ) は、「基本的な正規表現」を使用します。

-G, --basic-regexp
    Interpret PATTERN as a basic regular expression (BRE, see 
    below).  This is the default.

-E を指定すると、「拡張」正規表現が使用されます。

-E, --extended-regexp
    Interpret PATTERN as an extended regular expression (ERE, 
    see below).  (-E is specified by POSIX.)

そして、Perl 正規表現 (PCRE) の場合は -P を使用します。

-P, --perl-regexp
    Interpret PATTERN as a Perl regular expression.  This is highly 
    experimental and grep -P may warn  of  unimplemented features.

基本正規表現と拡張正規表現

基本的な正規表現では、メタ文字?+、、 、 は特別な意味を失います。代わりに、バックスラッシュ付きの{、、、、、を使用します。|()\?\+\{\|\(\)

従来の egrep はメタ文字をサポートしていませんでした{が、一部の egrep 実装で\{は代わりにサポートされているため、移植可能なスクリプトでは grep -E パターンを避け、リテラルに一致させるために を{使用する必要があります。[{]{

{GNU grep -E は、無効な間隔指定の開始となる場合は特殊文字ではないと 想定して、従来の使用法をサポートしようとします。たとえば、このコマンドは正規表現の構文エラーを報告する代わりにgrep -E '{1' 、2 文字の文字列を検索します{1。POSIX.2 ではこの動作を拡張機能として許可していますが、移植可能なスクリプトではこれを避ける必要があります。

したがって、grep は POSIX にできるだけ近づくように努めていますが、それでもまだいくつかの欠陥が残っています。

関連情報