正規表現「[az] [0-9] + $」が機能しない理由

正規表現「[az] [0-9] + $」が機能しない理由

私は文字列 "abc123"を処理するために正規表現を使用しています。次のコマンドが動作しており、「c123」の値を返します。

echo abc123 | grep -o [a-z][0-9]*$

ただし、以下のコマンドは機能しません。

echo abc123 | grep -o [a-z][0-9]+$

なぜこのような結果が出るのですか?

「*」は前のパターン要素と0回以上一致するために使用され、「+」は以前のパターン要素と少なくとも1回以上一致するために使用されることがわかります。

だからこの状況は私を混乱させます。

答え1

+ただの量子拡大する正規表現(ERE):

$ echo abc123 | grep -Eo '[a-z][0-9]+$'
c123

BRE(Basic Regular Expressions)ではリテラルと一致します+が、これを使用できますが、\{1,\}GNU grep(-oとにかくすでにGNU拡張)では次のようになります\+

$ echo abc123 | grep -o '[a-z][0-9]\+$'
c123

(シェル[による解釈を防ぐために引用符を参照してください)。\

答え2

+grepを適用するにはエスケープが必要です。変える

echo abc123 | grep -o [a-z][0-9]+$

あなたは書く必要があります

echo abc123 | grep -o '[a-z][0-9]\+$'

エスケープする必要がある他の文字もあります。正規表現を一重引用符で囲むのも良い習慣です。

egrep拡張REの同義語を使用grep -Eし、@muruがコメントアウトしたように拡張REを使用することもできます。

関連情報