私は文字列 "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を使用することもできます。