¿Cómo obtengo el estado de salida cuando uso el comando sed?


11

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.


77
Tenga en cuenta que sedciertamente tiene un estado de salida, simplemente no hace lo que necesita aquí. Si el sedcomando 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 si sedlogró hacer lo que le dijo que hiciera y si echo "foo.bar" | sed 's/pop.*$//'se ejecutó correctamente. Eliminó todas las líneas con pop. Que no hubiera tales líneas es irrelevante, el comando aún funcionaba.
terdon

@Zanna Iba a publicar una respuesta, pero sentí que esto en realidad no responde la pregunta. Solo explica una idea falsa, pero no proporciona una solución útil como Steeldriver tiene a continuación. Entonces un comentario parecía más apropiado.
terdon

Respuestas:


13

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 :

t
ramifica condicionalmente (es decir, salta a una etiqueta) solo si un s/// comando ha tenido éxito desde que se leyó la última línea de entrada o se tomó otra ramificación condicional.

Probablemente sea mejor elegir un valor para n que sea distinto de uno de los valores de estado de salida estándar:

Un estado de salida de cero indica éxito y un valor distinto de cero indica falla. GNU 'sed' devuelve los siguientes valores de error de estado de salida:

0
 Successful completion.

1
 Invalid command, invalid syntax, invalid regular expression or a
 GNU 'sed' extension command used with '--posix'.

2
 One or more of the input file specified on the command line could
 not be opened (e.g.  if a file is not found, or read permission is
 denied).  Processing continued with other files.

4
 An I/O error, or a serious processing error during runtime, GNU
 'sed' aborted immediately.

Así por ejemplo

$ echo "foo.bar" | sed 's/bar.*$//; t; q42' ; echo $? 
foo.
0

mientras

$ echo "foo.bar" | sed 's/baz.*$//; t; q42' ; echo $? 
foo.bar
42

Si desea omitir la impresión predeterminada del espacio del patrón, reemplácelo qpor Q(tenga en cuenta que Qes una extensión GNU).


1

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:

hello there
my dear old friend
a lot of things
we'll pass along the end

Aquí está mi función para imprimir todo + resaltar coincidencias + código de salida de retorno:

highlight()
{
  pattern=$1
  shift
  sed '/'"${pattern}"'/,${s//\x1b[32m&\x1b[0m/g;b};$q5' "$@"
}

$ resaltar "lo \ | end" input.txt || echo -e "\ n * No se encontraron coincidencias *"

hel lo que hay
mis queridos viejos vie terminar
una Mín t de cosas
vamos a pasar una Mín ng del extremo

Cuando no hay coincidencia, devolverá el código de salida (5). Puedes usarlo con gato y pipa | también:

$ cat input.txt | resalte "hot \ | y" || echo -e "\ n * No se encontraron coincidencias *"

hola
mi querido viejo amigo
muchas cosas
pasaremos al final

* No se encontraron coincidencias *

Gracias a https://unix.stackexchange.com/a/405725/43233 - Lo estoy usando + la opción de salir de sed.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.