grep '+'と '*'特殊文字を使用していくつかの簡単なテストを実行しました。
$ echo 'where wh+'> /tmp/toto
$ grep 'wh[e]\*' /tmp/toto
$ grep 'wh[e]*' /tmp/toto
where wh+
$ grep 'wh[e]+' /tmp/toto
$ grep 'wh+' /tmp/toto
$ grep 'wh[e]\+' /tmp/toto
where
$ grep -E 'wh[e]*' /tmp/toto
where wh+
$ grep -E 'wh[e]+' /tmp/toto
where wh+
これらのテストでは、拡張されていないgrep '+'(および '?')は特殊文字として解釈されず、特殊文字として使用するにはエスケープする必要があります。私が知る限り、grepは-Eオプションなしでデフォルトの正規表現を使用します。この場合、特殊文字はここで定義されます。 http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03 そして'? 「+」はBREの特殊文字ではありません。
しかし、BREで非特殊文字「+」をエスケープすると、特殊文字になるのはなぜですか?
ベストアンサー1
これはGNU拡張です。 ~からgrep(1)
マンページ:
GNU では、
grep
基本構文と拡張構文の間で使用できる機能に違いはありません。他の実装では、基本正規表現はそれほど強力ではありません。次の説明は拡張正規表現に適用されます。基本正規表現との違いは後で要約されます。
もっと下へ
基本正規表現と拡張正規表現
基本正規表現では、メタ文字、、、、および
?
は+
特別な意味を失います。代わりに、バックスラッシュバージョン、、、、、およびが{
使用されます。|
(
)
\?
\+
\{
\|
\(
\)