grepregex空白の動作


87

次のようなテキストファイルがあります。

12,34 EUR 
 5,67 EUR
 ...

'EUR'の前に空白が1つあり、0、XXEURは無視します。

私は試した:

grep '[1-9][0-9]*,[0-9]\{2\}\sEUR' => didn't match !

grep '[1-9][0-9]*,[0-9]\{2\} EUR' => worked !

grep '[1-9][0-9]*,[0-9]\{2\}\s*EUR' => worked !

grep '[1-9][0-9]*,[0-9]\{2\}\s[E]UR' => worked !

私が使用できない理由誰かは、plsは私を説明することができ\sますが\s*\s[E]マッチしましたか?

OS:Ubuntu 10.04、grep v2.5

回答:


122

これは\s、grep 2.5と新しいバージョンの処理における動作の違いのように見えます(古いgrepのバグ?)。grep 2.5.4で結果を確認しましたが、grep 2.6.3(Ubuntu 10.10)を使用すると、4つのgrepsすべてが機能します。

注意:

GNU grep 2.5.4
echo "foo bar" | grep "\s"
   (doesn't match)

一方、

GNU grep 2.6.3
echo "foo bar" | grep "\s"
foo bar

おそらくトラブルが少ない(\s文書化されていないように):

Both GNU greps
echo "foo bar" | grep "[[:space:]]"
foo bar

私のアドバイスは、代わりに\s... use[ \t]*または[[:space:]]そのようなものを使用しないようにすることです。


24
または、たとえば[:space:]、このように:cat file | grep "[[:space:]]"
Kiril Kirov

このバグリクエストmail-archive.com/bug-grep@gnu.org/msg02686.htmlによると、新しいバージョンのgrep(他の観点)のバグのようですが、最後のステートメントが一致するのはなぜですか?
マイルド2010年

1
@Mildeは、フォローポストに注意mail-archive.com/bug-grep@gnu.org/msg02689.html(これは新しいのgrepのバグではないと考えられるので)そのバグレポートは無効とマークし、閉じられました。
カマル2010年

2
@Milde、私が調べた(古いまたは新しい)grepドキュメントのどれも実際に\sはまったく参照していません。その振る舞いは「未定義」だと思います。代わりに[:space:]を使用してください。これは、新旧のgrepに記載されているとおりに機能します。
カマル2010年

おかげで、私は問題を回避するために将来[:space:]を使用します
Milde 2010年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.