grepマニュアルによると:
* The preceding item will be matched zero or more times.
+ The preceding item will be matched one or more times.
テストしてみましょう
echo 'agb' | grep 'a.*b' # returns agb
echo 'agb' | grep 'a.+b' # returns nothing
+が3gsと一致しないのはなぜですか?私が知る限り、3対1が大きい。
答え1
私たちが「正規表現」と考えているものの多くは、実際に正規表現と呼ばれています。拡張正規表現(またはERE)をPOSIXで使用します。しかし、あなたのgrep
携帯電話がついているようです。基本正規表現モード(または減らしてBRE)です。 BREとEREには多くの違いがあります。これらの違いの1つは、+
バックスラッシュでエスケープしない限り、メタ文字をエスケープする必要があることです。は文字通りのプラス記号です。あなたのgrep
コマンドはBREモードにあるようですので、\+
一般的な+
。
BREとEREを非常に厳密に比較すると、BREは構文を使用してエミュレートすることができますが、実際には+
操作をサポートしません。 Strict BREも演算子をサポートしておらず、BREでこれをエミュレートする方法がわかりません。ただし、EREとは異なり、BREは逆参照をサポートしています(括弧をエスケープする必要があることを除いて、Perlによく似ています)。?
\{1,\}
\{0,1\}
|
いくつかの実装(例:GNU)はgrep
BREモードで?
演算子+
をサポートしていますが、|
他のメタ文字のようにエスケープする必要があります\?
。しかし、私が知っている限り、EREモードでは逆参照をサポートする実装はありません。\+
\|
grep
EREモードを強制的に使用するには、grep
オプションを使用するか、またはで-E
呼び出すgrep
こともできますegrep
。
答え2
どのgrepマニュアルを読んでも、さまざまな種類の正規表現(基本と拡張)を説明するセクションが必要です。この+
演算子は基本バージョンでは使用できず、拡張バージョンでのみ使用できます。拡張正規表現を使用するには、この-E
オプションが必要です。