
Si lo uso grep -q
en combinación con -v
para devolver 0 si no hay coincidencias o 1 si hay una coincidencia, funciona siempre que la entrada sea una sola línea:
$ echo 'abc' | grep -q -v a; echo $?
1
$ echo 'abc' | grep -q -v x; echo $?
0
Pero si la entrada es de varias líneas, grep siempre devolverá 0:
$ echo -e 'a\nb\nc' | grep -q -v a; echo $?
0
$ echo -e 'a\nb\nc' | grep -q -v x; echo $?
0
¿Cuál es el motivo de tal comportamiento?
Sé que la forma correcta en este caso sería usar ! grep -q
en lugar de grep -q -v
, pero aún así quiero saber la respuesta.
Respuesta1
Por manual de grep:
-v, --invert-match
Selected lines are those not matching any of the specified patterns.
Si proporciona solo una línea abc
y le indica grep
que seleccione solo las líneas que no coinciden, a
obtendrá una salida vacía y un código de retorno igual a 1.
Si proporciona tres líneas a
, b
y c
y le indica grep
que seleccione solo aquellas que no coinciden, a
obtendrá b
y c
en la salida y 0 como código de retorno.
$ echo -e 'a\nb\nc' | grep -v a; echo $?
b
c
0