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

1

Se eu usar grep -q em combinação com -v para retornar 0 se não houver correspondências ou 1 se houver correspondência, isso funcionará enquanto a entrada for uma única linha:

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

Mas se a entrada for multi-linha, o 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 maneira correta nesse caso seria usar ! grep -q em vez de grep -q -v , mas ainda quero saber a resposta.

    
por Thunderbeef 12.02.2016 / 11:40

1 resposta

2

Por manual do grep:

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

Se você fornecer apenas uma linha abc e informar grep para selecionar apenas linhas que não correspondam a a , você obtém uma saída vazia e um código de retorno igual a 1.

Se você fornecer três linhas a , b e c e informar grep para selecionar apenas as que não corresponderem a a , você recebe b e c na saída e 0 como retorno código.

$ echo -e 'a\nb\nc' | grep -v a; echo $?
b
c
0
    
por 12.02.2016 / 11:49