Por que “grep -q -v” só funciona com entrada de linha única?

Por que “grep -q -v” só funciona com entrada de linha única?

Se eu usar grep -qem combinação com -vpara retornar 0 se não houver correspondências ou 1 se houver correspondência, funcionará desde que a entrada seja uma única linha:

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

Mas se a entrada for multilinha, grep sempre retornará 0:

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

Qual é a razão para tal comportamento?

Sei que a forma correta nesse caso seria usar ! grep -qem vez de grep -q -v, mas ainda quero saber a resposta.

Responder1

Por manual do grep:

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

Se você fornecer apenas uma linha abce solicitar grepque selecione apenas as linhas que não correspondam, avocê obterá uma saída vazia e um código de retorno igual a 1.

Se você fornecer três linhas a, be ce informar greppara selecionar apenas aquelas que não correspondem, avocê obterá band cna saída e 0 como código de retorno.

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

informação relacionada