Un peu tard pour la fête mais pour le bénéfice des autres, j'ai trouvé que le drapeau "w" était exactement ce que je cherchais.
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 contiendra chaque modification (c'est-à-dire le texte modifié) sur sa propre ligne. S'il n'y a eu aucun changement, changelog.txt sera de zéro octet.
Une ressource sed vraiment utile (et où j'ai trouvé cette information) est http://www.grymoire.com/Unix/Sed.html.
Cela pourrait fonctionner pour vous (GNU sed):
sed -i.bak '/'"$old_pattern"'/{s//'"$new_pattern"'/;h};${x;/./{x;q1};x}' file || echo changed
Explication :
/'"$old_pattern"'/{s//'"$new_pattern"'/;h}si l'espace de motif (PS) contient leold pattern, remplacez-le par lenew patternet copiez le PS dans l'espace de maintien (HS).${x;/./{x;q1};x}en rencontrant la dernière ligne, passez au HS et testez-le pour la présence de toute chaîne. Si une chaîne est trouvée dans le HS (c'est-à-dire qu'une substitution a eu lieu), revenez au PS d'origine et quittez en utilisant le code de sortie de1, sinon revenez au PS d'origine et quittez avec le code de sortie0(valeur par défaut).
Je pense que ces extensions GNU sed pourraient vous être utiles
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.
et
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.
Il semble que ce soit exactement ce que vous cherchez.
Vous pouvez comparer le fichier d'origine avec la sortie sed pour voir s'il a changé :
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"