salut,
tac | sed est une bonne approche, par contre il faut oublier l'édition inplace à mon avis, il y a peut-être moyen mais le gain est probablement moindre que la complexité de mise en oeuvre (je suis pas un as avec sed, mais avec awk c'est le cas)
si on part sur ton idée de tac le fichier (le code est déplié pour la lisibilité) :
1 2 3 4 5 6 7 8 9
| $ tac fichier | sed -r '
/[^0-9]223\.129\.130\.16[^0-9]/ {
n;
s/([0-9a-f]{2}:){5}([0-9a-f]{2})/TOTO/;
n;
s/SRV00[1-9][0-9]{2}/POUET/;
n;
s/SRV00[1-9][0-9]{2}/POUET/
}' | tac |
il suffit d'une redirection qui va bien derrière pour enregistrer le nouveau fichier (et pour info l'édition en ligne fait rigoureusement la même chose de toutes façon, c'est juste transparent pour l'utilisateur)
j'ai une affection pour awk :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| $ awk -vIP="223.129.130.16" -vSERVNAME="POUET" -vMACADDR="TOTO" '
{
# on met tout le fichier en memoire, dans un tableau
ligne[NR-1]=$0;
}
$0 ~ "[^0-9]" IP "[^0-9]" { # on match si IP _exacte_
# on effectue les modifications sur les lignes precedentes
gsub(/SRV00[1-9][0-9]{2}/, SERVNAME, ligne[NR-4]);
gsub(/SRV00[1-9][0-9]{2}/, SERVNAME, ligne[NR-3]);
gsub(/([0-9a-f]{2}:){5}([0-9a-f]{2})/, MACADDR, ligne[NR-2]);
}
END {
# a la fin on afficher toutes les lignes du fichier
for (i = 0; i < NR; i++) {
printf("%s\n", ligne[i]);
}
}
' fichier |
ça passe tel quel dans la console, au besoin on pourra aussi mettre le script dans un fichier, l'invocation devient un peu plus lisible :
awk -f script.awk -vIP="223.129.130.16" -vSERVNAME="POUET" -vMACADDR="TOTO" fichier
pareil, une redirection dans un nouveau fichier, suivi d'un remplacement à coup de mv et on en parle plus
Partager