Почему «grep -q -v» работает только с однострочным вводом?

Почему «grep -q -v» работает только с однострочным вводом?

Если я использую grep -qв сочетании с -vдля возврата 0, если совпадений нет, или 1, если совпадение есть, это работает, пока входные данные представляют собой одну строку:

$ echo 'abc' | grep -q -v a; echo $?
1
$ echo 'abc' | grep -q -v x; echo $?
0

Но если входные данные многострочные, grep всегда будет возвращать 0:

$ echo -e 'a\nb\nc' | grep -q -v a; echo $?
0
$ echo -e 'a\nb\nc' | grep -q -v x; echo $?
0

В чем причина такого поведения?

Я знаю, что правильным способом в данном случае было бы использовать ! grep -qвместо grep -q -v, но я все равно хочу знать ответ.

решение1

Согласно руководству по grep:

-v, --invert-match
         Selected lines are those not matching any of the specified patterns.

Если вы предоставите только одну строку abcи укажете grepвыбрать только несовпадающие строки, aвы получите пустой вывод и код возврата, равный 1.

Если вы предоставите три строки a, b, и cи укажете grepвыбрать только те, которые не соответствуют, aвы получите bи cна выходе и 0 в качестве кода возврата.

$ echo -e 'a\nb\nc' | grep -v a; echo $?
b
c
0

Связанный контент