grep +演算子

grep +演算子

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)はgrepBREモードで?演算子+をサポートしていますが、|他のメタ文字のようにエスケープする必要があります\?。しかし、私が知っている限り、EREモードでは逆参照をサポートする実装はありません。\+\|grep

EREモードを強制的に使用するには、grepオプションを使用するか、またはで-E呼び出すgrepこともできますegrep

答え2

どのgrepマニュアルを読んでも、さまざまな種類の正規表現(基本と拡張)を説明するセクションが必要です。この+演算子は基本バージョンでは使用できず、拡張バージョンでのみ使用できます。拡張正規表現を使用するには、この-Eオプションが必要です。

関連情報