Странное поведение grep - PullRequest
5 голосов
/ 05 февраля 2012

По мотивам этого вопроса, кто-нибудь может объяснить следующее поведение?

$ echo "-uus" | grep -wo '[0]*' && echo matched
-uus

matched
$ echo "-uus" | grep -o '[0]*' && echo matched
matched
$ grep --version | sed 1q
grep (GNU grep) 2.5.1

В частности, почему второй grep успешен, но не генерирует вывод? И почему первая команда имеет две строки вывода? Я могу понять вторую строку вывода, но я не понимаю первую.

Ответы [ 2 ]

3 голосов
/ 19 октября 2012

В старых версиях grep были ошибки. Я сообщил об этом здесь:

https://bugzilla.redhat.com/show_bug.cgi?id=144980

В более новых версиях grep проблема больше не возникает.

1 голос
/ 05 февраля 2012

Вопрос: Почему grep успешен, но не генерирует вывод?

$ echo "-uus" | grep -o '[0]*' && echo matched
matched

Ответ:

Шаблон [0]* означает по крайней мере ноль символов.Поэтому grep говорит, что находит его, даже если сопоставленный текст пуст.grep, используемый с параметром -o, не печатает пустую совпавшую строку.На странице man написано:

-o, --only-match
Печать только совпадающих (не пустых) частей совпадающей строки, с каждымтакая часть в отдельной строке вывода.

Вы можете даже использовать пустой шаблон, он выводит то же самое:

$ echo "-uus" | grep -o '' && echo matched 
matched

Вы также можете проверить:

$ echo    | grep -o '' && echo matched || echo unmatched
matched
$ echo -n | grep -o '' && echo matched || echo unmatched
unmatched

Однако grep печатает даже пустые строки, когда опция -o не используется:

$ echo    | grep '' && echo matched || echo unmatched

matched


Вопрос: Почему первая команда имеет две строки вывода?

$ echo "-uus" | grep -wo '[0]*' && echo matched
-uus

matched
$ grep --version | sed 1q
grep (GNU grep) 2.5.1

Ответ:

Похоже на ошибку в GNU grep 2.5.1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...