- GNU bash、バージョン 4.2.46(2)-リリース(x86_64-redhat-linux-gnu)
- grep (GNU grep) 2.20
- grep-2.20-3.el7.x86_64
このパズルを説明できる人はいますか? grep/egrep と誤って一致します。
echo "somestringthing" | egrep '\bstring*'
(no output as expected)
echo "somestringthing" | egrep '\bsomestring*'
somestringthing
echo "somestringthing" | egrep '\bsomestringthingy*'
somestringthing
echo "somestringthing" | egrep '\bsomestringthing1*'
somestringthing
echo "somestringthing" | egrep '\bsomestringthingX*'
somestringthing
ワイルドカードの前に文字があるので、最後の3つが一致してはいけません。実験の結果、ワイルドカード文字の前に単一の文字がないように、すべての文字列が一致することがわかりました。
'\b'は参照用にのみ使用される単語境界です。
ここで何か抜けましたか?それともgrepのバグですか? (動作していると思うコードをデバッグしようとしているクレイジーについて話してください。)
ベストアンサー1
最後の3つの正規表現の末尾にある、およびはそれぞれ0個以上、およびと一致しy*
ます1*
。X*
y
1
X
入力文字列の末尾にはsomestringthing
実際にはこれらの文字がゼロ個以上あります(正確に0)、3つの式がすべて一致します。
合わせたいなら一つまたは、拡張正規表現を使用するか、デフォルトの正規表現を使用しないか、含まない文字列y
の末尾にあります。y+
y{1,}
yy*
y\{1,\}
grep
-E
echo somestringthing | grep -E 'somestringthingy+'
(これを行うと出力は生成されません)
また、使用されなくなり、完全な単語のみを一致させたい場合をegrep
使用する必要があります(入力で一致の始まりと終わりに単語の境界が必要です)。grep -E
grep -E -w