grep с регулярным выражением: пробел не совпадает, если я не добавлю утверждение - PullRequest
7 голосов
/ 10 августа 2011

GNU grep 2.5.4 на bash 4.1.5 (1) на Ubuntu 10.04

Это соответствует

$ echo "this is a     line" | grep 'a[[:space:]]\+line'
this is a     line

Но это не

$ echo "this is a     line" | grep 'a\s\+line'

Но это тоже соответствует

$ echo "this is a     line" | grep 'a\s\+\bline'
this is a     line

Я не понимаю, почему # 2 не совпадает (тогда как # 1 соответствует), а # 3 также показывает совпадение.Какая здесь разница?

Ответы [ 2 ]

4 голосов
/ 11 августа 2011

Взгляните на свою grep справочную страницу. Perl добавил множество расширений регулярных выражений, которых не было в исходной спецификации. Однако, поскольку они оказались настолько полезными, многие программы приняли их.

К сожалению, grep иногда застревает в прошлом, потому что вы хотите убедиться, что ваша команда grep остается совместимой со старыми версиями grep.

Некоторые системы имеют egrep с некоторыми расширениями. Другие позволяют вам использовать grep -E, чтобы получить их. Третьи имеют grep -P, который позволяет вам использовать расширения Perl. Я считаю, что команда grep систем Linux может использовать расширение -P, которое недоступно в большинстве систем Unix, если кто-то не заменил grep версией GNU. Более новые версии Mac OS X также поддерживают переключатель -P, но не более старые версии.

1 голос
/ 10 августа 2011

grep не поддерживает полный набор регулярных выражений, поэтому попробуйте использовать -P для включения регулярных выражений perl.Вам не нужно убегать от + т.е.

echo "this is a     line" | grep -P 'a\s+line' 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...