El grep
comando muestra un estado de salida:
$echo "foo.bar" | grep -o foo
foo
$echo $?
0
$echo "foo.bar" | grep -o pop
$echo $?
1
Pero necesito usar sed
y me di cuenta de que no tiene estado de salida:
$echo "foo.bar" | sed 's/bar.*$//'
foo.
$echo $?
0
$echo "foo.bar" | sed 's/pop.*$//'
foo.bar
$echo $?
0
Sé que debería jugar con la -q
opción, pero no he tenido éxito.
command-line
sed
Josef Klimuk
fuente
fuente
sed
ciertamente tiene un estado de salida, simplemente no hace lo que necesita aquí. Si elsed
comando falla, por ejemplo, si intenta ejecutarlo en un archivo al que no tiene acceso de escritura o que no existe,sed
saldrá con un estado de salida que no sea 0. El estado de salida solo indica sised
logró hacer lo que le dijo que hiciera y siecho "foo.bar" | sed 's/pop.*$//'
se ejecutó correctamente. Eliminó todas las líneas conpop
. Que no hubiera tales líneas es irrelevante, el comando aún funcionaba.Respuestas:
Puede usar q n para salir con el estado de salida n , pero para que sea útil, también necesitará usar algunas ramas y control de flujo :
Probablemente sea mejor elegir un valor para n que sea distinto de uno de los valores de estado de salida estándar:
Así por ejemplo
mientras
Si desea omitir la impresión predeterminada del espacio del patrón, reemplácelo
q
porQ
(tenga en cuenta queQ
es una extensión GNU).fuente
Aquí le mostramos cómo buscar expresiones regulares con sed y resaltar coincidencias o devolver el código de salida (5) si no se encuentra ninguna coincidencia:
Esto es input.txt:
Aquí está mi función para imprimir todo + resaltar coincidencias + código de salida de retorno:
Cuando no hay coincidencia, devolverá el código de salida (5). Puedes usarlo con gato y pipa | también:
* No se encontraron coincidencias *
Gracias a https://unix.stackexchange.com/a/405725/43233 - Lo estoy usando + la opción de salir de sed.
fuente