grep/egrepに一致する奇妙な正規表現

grep/egrepに一致する奇妙な正規表現
  • 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*y1X

入力文字列の末尾にはsomestringthing実際にはこれらの文字がゼロ個以上あります(正確に0)、3つの式がすべて一致します。

合わせたいなら一つまたは、拡張正規表現を使用するか、デフォルトの正規表現を使用しないか、含まない文字列yの末尾にあります。y+y{1,}yy*y\{1,\}grep-E

echo somestringthing | grep -E 'somestringthingy+'

(これを行うと出力は生成されません)

また、使用されなくなり、完全な単語のみを一致させたい場合をegrep使用する必要があります(入力で一致の始まりと終わりに単語の境界が必要です)。grep -Egrep -E -w

おすすめ記事