GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo verificar si sed ha cambiado un archivo

Un poco tarde para la fiesta pero para el beneficio de los demás, encontré que la bandera 'w' era exactamente lo que estaba buscando.

sed -i "s/$pattern/$new_pattern/w changelog.txt" "$filename"
if [ -s changelog.txt ]; then
    # CHANGES MADE, DO SOME STUFF HERE
else
    # NO CHANGES MADE, DO SOME OTHER STUFF HERE
fi

changelog.txt contendrá cada cambio (es decir, el texto modificado) en su propia línea. Si no hubo cambios, changelog.txt serán cero bytes.

Un recurso sed realmente útil (y donde encontré esta información) es http://www.grymoire.com/Unix/Sed.html.


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

sed -i.bak '/'"$old_pattern"'/{s//'"$new_pattern"'/;h};${x;/./{x;q1};x}' file || echo changed

Explicación:

  • /'"$old_pattern"'/{s//'"$new_pattern"'/;h} si el espacio patrón (PS) contiene el old pattern , reemplácelo por el new pattern y copie el PS en el espacio de espera (HS).
  • ${x;/./{x;q1};x} al encontrar la última línea, cambie al HS y pruébelo para detectar la presencia de cualquier cadena. Si se encuentra una cadena en el HS (es decir, se ha realizado una sustitución), vuelva al PS original y salga usando el código de salida de 1 , de lo contrario, vuelva al PS original y salga con el código de salida de 0 (el predeterminado).

Creo que puede encontrar útiles estas extensiones sed de GNU

t label

If a s/// has done a successful substitution since the last input line
was read and since the last t or T command, then branch to label; if
label is omitted, branch to end of script.

y

q [exit-code]

Immediately quit the sed script without processing any more input, except 
that if auto-print is not disabled the current pattern space will be printed. 
The exit code argument is a GNU extension.

Parece exactamente lo que estás buscando.


Puede comparar el archivo original con la salida sed para ver si cambió:

sed -i.bak s:$pattern:$new_pattern: "$filename"
if ! diff "$filename" "$filename.bak" &> /dev/null; then
  echo "changed"
else
  echo "not changed"
fi
rm "$filename.bak"

Linux
  1. Cómo verificar la sintaxis de sudoers

  2. ¿Cómo verificar la subcadena en Shell Script Bash?

  3. ¿Cómo verificar syslog en Bash en Linux?

  4. ¿Cómo insertar un texto al principio de un archivo?

  5. ¿Cómo verificar si un archivo está vacío en Bash?

Cómo verificar si existe un archivo o directorio en Bash

Cómo verificar/reparar el sistema de archivos de Linux en el arranque

Cómo comprobar y reparar un sistema de archivos en RHEL Linux

Cómo verificar si existe un archivo o directorio en Bash Shell

Tutorial de Unix Sed:Cómo escribir en un archivo usando Sed

Cómo usar Sed para buscar y reemplazar una cadena en un archivo