Comment vérifier si sed a changé un fichier
Je suis en train d'essayer de trouver un moyen astucieux pour savoir si le fichier a été transmis à la sed a été modifié avec succès ou non.
En gros, je veux savoir si le fichier a été modifié ou non, sans avoir à regarder la date de modification des fichiers.
La raison pour laquelle j'ai besoin c'est parce que j'ai besoin de faire quelques trucs supplémentaires si sed a remplacé avec succès un modèle.
J'ai actuellement:
grep -q $pattern $filename
if [ $? -eq 0 ]
then
sed -i s:$pattern:$new_pattern: $filename
# DO SOME OTHER STUFF HERE
else
# DO SOME OTHER STUFF HERE
fi
Le code ci-dessus est un peu cher et j'aimerais être en mesure d'utiliser certains hacks ici.
source d'informationauteur breakdown1986
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
awk
à la place:Je suis ignorant la
-i
fonctionnalité: vous pouvez utiliser le shell de faire les redirections nécessaires.Un peu en retard à la fête, mais pour le bénéfice des autres, j'ai trouvé le " w " drapeau à être exactement ce que je cherchais.
changelog.txt
contiendra chaque changement (c'est à dire le texte modifié) sur sa propre ligne. Si il n'y avait pas de changements,changelog.txt
sera de zéro octets.Vraiment utile sed ressources (et où j'ai trouvé cette info) est http://www.grymoire.com/Unix/Sed.html.
Je crois que vous pouvez trouver ces GNU sed extensions utiles
et
Il semble être exactement ce que vous cherchez.
Cela pourrait fonctionner pour vous (GNU sed):
Explication:
/'"$old_pattern"'/{s//'"$new_pattern"'/;h}
si le modèle de l'espace (PS) contient lesold pattern
il faut la remplacer parnew pattern
et la copie de la PS à la cale de l'espace (HS).${x;/./{x;q1};x}
sur la rencontre de la dernière ligne, swap pour le HS et de le tester pour la présence de n'importe quelle chaîne. Si une chaîne est trouvée dans le HS (c'est à dire une substitution a eu lieu) swap en arrière à l'original du PS et de sortie en utilisant le code de sortie de1
sinon swap en arrière à l'original du PS et de sortie avec le code de sortie de0
(valeur par défaut).Vous pouvez diff sur le fichier d'origine avec le sed de sortie pour voir si ça a changé:
Je sais que c'est une vieille question, et l'utilisation de awk au lieu de sed est peut-être la meilleure idée, mais si l'on veut coller avec sed, une idée est d'utiliser l'option-w. Le fichier argument de la w drapeau ne contient que les lignes avec une allumette. Donc, nous avons seulement besoin de vérifier qu'elle n'est pas vide.