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 ilold pattern
, sostituiscilo connew 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 uscita1
, altrimenti torna al PS originale ed esci con il codice di uscita0
(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"