El grepcomando 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 sedy 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 -qopción, pero no he tenido éxito.
command-line
sed
Josef Klimuk
fuente
fuente

sedciertamente tiene un estado de salida, simplemente no hace lo que necesita aquí. Si elsedcomando falla, por ejemplo, si intenta ejecutarlo en un archivo al que no tiene acceso de escritura o que no existe,sedsaldrá con un estado de salida que no sea 0. El estado de salida solo indica sisedlogró 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
qporQ(tenga en cuenta queQes 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