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 pattern
et 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"