Вопрос: Почему 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