
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 にできるだけ近づくように努めていますが、それでもまだいくつかの欠陥が残っています。