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