2015-07-01 5 views
0

В linux, когда я пробую простой egrep для слова, он не совпадает. Следующий оленья кожа возвращает никакого результата, однако я ожидаю образец в обоих случаях совпадают:egrep "[ w] +" не соответствует ни одному слову

echo "sample"|egrep "[\w]+" 
echo "sample"|egrep "[\w]" 

Однако следующие возвращает слово образец:

echo "sample"|egrep "[\w]*" 
sample 

ответ

2

С е Xtended сопоставление, объекты, такие как \w, не разворачиваются внутри квадратных скобок. Поэтому их избежать:

echo sample | grep -E '\w+' 

(egrep является устаревшим псевдонимом grep -E.)


Если вы действительно хотите использовать квадратные скобки, а затем использовать р Эрл регулярные выражения:

echo sample | grep -P '[\w]+' 

(Обратите внимание, что это функция, отличная от GNU, не относящая к POSIX.)


Наконец, за ваш интерес, [\w]* с -E не соответствует ни слова, но он соответствует нулю или более символов. И учитывая, что по крайней мере нулевые символы содержатся в каждой строке, grep показывает каждую строку. Сравнить:

echo another.sample | grep --color=always -E '[\w]*' 
echo another.sample | grep --color=always -E '\w+' 

Вы увидите, что первая команда возвращает черную строку (что означает, что она не соответствует любому символу). Второй вместо этого выделит еще один и образец, но не точку, что означает, что он правильно соответствовал двум словам. Вы также можете попробовать с grep -Eo.

+0

Спасибо andrea :) Это не ошибка, которая с расширенным соответствием \ w не работает? Существуют ли другие объекты, подобные \ w, которые не будут работать, когда внутри скобки? Я пробовал много искать, но не мог ссылаться на такой сценарий. – anurag86

+0

@ anurag86: поведение не является ошибкой и описано в man-странице для grep: * Скобковое выражение представляет собой список символов, заключенных ** [** и **] **. Он соответствует любому одиночному символу в этом списке *. Если вы посмотрите, вы увидите, что символ обратной косой черты не имеет особого значения. –

Смежные вопросы