GNU/Linux >> Tutoriales Linux >  >> Linux

Código de retorno de sed para ninguna coincidencia

como comentó @cnicutar, el código de retorno de un comando significa si el comando se ejecutó con éxito. no tiene nada que ver con la lógica que implementaste en los códigos/scripts.

así que si tienes:

echo "foo"|sed '/bar/ s/a/b/'

sed devolverá 0 pero si escribe algunos errores de sintaxis/expresión, o la entrada/archivo no existe, sed no puede ejecutar su solicitud, sed devolverá 1.

solución alternativa

esto en realidad no es una solución alternativa . sed tiene q comando:(de la página man):

 q [exit-code]

aquí puede definir el código de salida como desee. Por ejemplo '/foo/!{q100}; {s/f/b/}' saldrá con el código 100 si foo no está presente y, de lo contrario, realice la sustitución f->b y salga con el código 0.

Caso coincidente:

kent$  echo "foo" | sed  '/foo/!{q100}; {s/f/b/}'
boo
kent$  echo $?
0

Caso no coincidente:

kent$ echo "trash" | sed  '/foo/!{q100}; {s/f/b/}'
trash
kent$ echo $?
100

Espero que esto responda a tu pregunta.

editar

Debo agregar que el ejemplo anterior es solo para el procesamiento de una línea. No sé su requisito exacto. cuando quieres obtener exit 1 . una línea sin igual o todo el archivo. Si el archivo completo no coincide con el caso, puede considerar awk, o incluso hacer un grep antes de su procesamiento de texto...


Esto podría funcionar para usted (GNU sed):

sed '/search-string/{s//replacement-string/;h};${x;/./{x;q0};x;q1}' file

Si el search-string se encuentra, será reemplazado por replacement-string y al final del archivo sed saldrá con 0 código de retorno. Si no se realiza ninguna sustitución, el código de retorno será 1 .

Una explicación más detallada:

En sed, el usuario tiene dos registros a su disposición:el espacio de patrón (PS) en el que se carga la línea actual (menos el salto de línea) y un registro de repuesto llamado espacio de retención (HS) que inicialmente está vacío.

La idea general es utilizar el SA como bandera para indicar si se ha producido una sustitución. Si el HS todavía está vacío al final del archivo, entonces no se han realizado cambios; de lo contrario, se han producido cambios.

El comando /search-string/ coincide con search-string con lo que sea que esté en el PS y si se encuentra que contiene el search-string se ejecutan los comandos entre las siguientes llaves.

En primer lugar la sustitución s//replacement-string/ (sed usa la última expresión regular, es decir, search-string , si el lado izquierdo está vacío, entonces s//replacement-string es lo mismo que s/search-string/replacement-string/ ) y siguiendo este el h El comando hace una copia del PS y la coloca en el HS.

El comando sed $ se utiliza para reconocer la última línea de un archivo y luego ocurre lo siguiente.

Primero el x El comando intercambia los dos registros, por lo que el HS se convierte en el PS y el PS se convierte en el HS.

Luego se busca en el PS cualquier carácter /./ (. significa coincidir con cualquier carácter) recuerde que el HS (ahora el PS) estaba inicialmente vacío hasta que se realizó una sustitución. Si la condición es verdadera el x se vuelve a ejecutar seguido de q0 comando que finaliza todo el procesamiento sed y establece el código de retorno en 0 . De lo contrario, el x se ejecuta el comando y el código de retorno se establece en 1 .

nótese bien aunque el q abandona el procesamiento de sed, no impide que sed vuelva a ensamblar el PS y se imprima como de costumbre.

Otra alternativa:

sed '/search-string/!ba;s//replacement-string/;h;:a;$!b;p;x;/./Q;Q1' file

o:

sed '/search-string/,${s//replacement-string/;b};$q1' file

Estas respuestas son demasiado complicadas. ¿Qué hay de malo en escribir un poco de script de shell que use grep para averiguar si lo que desea reemplazar está allí y luego usar sed para reemplazarlo?

grep -q $TARGET_STRING $file
if [ $? -eq 0 ]
then
    echo "$file contains the old site"
    sed -e "s|${TARGET_STRING}|${NEW_STRING}|g" ....
fi

Linux
  1. 8 consejos para la línea de comandos de Linux

  2. Obtenga el código fuente para cualquier comando de Linux

  3. Ejemplos de comandos sed en Linux

  4. código de retorno grep de Linux

  5. ¿Dónde está el último código fuente del comando man para Linux?

Tutorial de comandos Linux nl para principiantes (7 ejemplos)

Tutorial de comandos de Linux nm para principiantes (10 ejemplos)

Tutorial de comandos OD de Linux para principiantes (6 ejemplos)

Tutorial de comando Linux w para principiantes (5 ejemplos)

Tutorial de comandos ss de Linux para principiantes (8 ejemplos)

Exa:un reemplazo moderno para ls Command