GNU/Linux >> Tutoriels Linux >  >> Linux

Comment vérifier si sed a modifié un fichier

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 le old pattern , remplacez-le par le new 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 de 1 , sinon revenez au PS d'origine et quittez avec le code de sortie 0 (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"

Linux
  1. Comment vérifier si Bash a la vulnérabilité Shellshock ?

  2. Comment remplacer une chaîne dans un ou plusieurs fichiers ?

  3. Comment supprimer un fichier dont le nom de fichier contient des caractères non imprimables ?

  4. Comment vérifier la progression de l'exécution de Cp ?

  5. Comment vérifier syslog dans Bash sous Linux ?

Comment vérifier si un fichier ou un répertoire existe dans Bash

Comment vérifier/réparer le système de fichiers Linux au démarrage

Comment vérifier et réparer un système de fichiers dans RHEL Linux

Comment vérifier si un fichier ou un répertoire existe dans Bash Shell

Tutoriel Unix Sed :comment écrire dans un fichier à l'aide de Sed

Comment utiliser Sed pour rechercher et remplacer une chaîne dans un fichier