web-dev-qa-db-ja.com

grep正規表現の空白の動作

私は次のようなものを含むテキストファイルを持っています:

12,34 EUR 
 5,67 EUR
 ...

「EUR」の前に空白が1つあり、0、XX EURを無視します。

私は試した:

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 !

誰かが私に説明してもらえますか、なぜ\sを使用できないが、\s*\s[E]は一致しますか?

OS:Ubuntu 10.04、grep v2.5

74
Milde

これは、grep 2.5と新しいバージョン間での\sの処理の動作の違いのように見えます(古い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の使用を避けることです...代わりに[ \t]*または[[:space:]]などを使用してください。

100
Kamal