grep regex - пробельное поведение - PullRequest
73 голосов
/ 20 ноября 2010

У меня есть текстовый файл, содержащий что-то вроде:

12,34 EUR 
 5,67 EUR
 ...

Существует один пробел перед 'EUR', и я игнорирую 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] совпадают?

ОС: Ubuntu 10.04, grep v2.5

1 Ответ

98 голосов
/ 20 ноября 2010

Это похоже на разницу в поведении \s между grep 2.5 и более новыми версиями (ошибка в старой grep?).Я подтверждаю ваш результат с помощью grep 2.5.4, но все четыре ваших greps работают при использовании grep 2.6.3 (Ubuntu 10.10).

Примечание:

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:]] или что-то ещенравится вместо этого.

...