GNU/Linux >> Linux Esercitazione >  >> Linux

Come verificare se sed ha modificato un file

Un po' in ritardo per la festa, ma a beneficio degli altri, ho scoperto che la bandiera "w" era esattamente quello che stavo cercando.

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 conterrà ogni modifica (cioè il testo modificato) sulla propria riga. Se non ci sono state modifiche, changelog.txt saranno zero byte.

Una risorsa sed davvero utile (e dove ho trovato queste informazioni) è http://www.grymoire.com/Unix/Sed.html.


Questo potrebbe funzionare per te (GNU sed):

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

Spiegazione:

  • /'"$old_pattern"'/{s//'"$new_pattern"'/;h} se il pattern space (PS) contiene il old pattern , sostituiscilo con new pattern e copia il PS nello spazio di attesa (HS).
  • ${x;/./{x;q1};x} incontrando l'ultima riga, passare all'HS e testarlo per la presenza di qualsiasi stringa. Se viene trovata una stringa nell'HS (ovvero è avvenuta una sostituzione), torna al PS originale ed esci utilizzando il codice di uscita 1 , altrimenti torna al PS originale ed esci con il codice di uscita 0 (impostazione predefinita).

Credo che tu possa trovare utili queste estensioni GNU sed

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.

e

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.

Sembra proprio quello che stai cercando.


Puoi differenziare il file originale con l'output sed per vedere se è cambiato:

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. Come verificare se Bash ha una vulnerabilità Shellshock?

  2. Come controllare la sintassi di sudoers

  3. Come sostituire una stringa in un file?

  4. Come usare sed per sostituire la variabile di un file di configurazione?

  5. Come posso usare sudo per verificare se esiste un file?

Come verificare se un file o una directory esiste in Bash

Come controllare/riparare il file system Linux all'avvio

Come controllare e riparare un file system in RHEL Linux

Come verificare se esiste un file o una directory in Bash Shell

Tutorial Unix Sed:come scrivere su un file usando Sed

Come utilizzare Sed per trovare e sostituire una stringa in un file