Commande sed pour remplacer du texte
Résoluzipe31 Messages postés 34620 Date d'inscription Statut Contributeur Dernière intervention -
J'essaie de remplacer une IP dans le fichier host
cat /etc/hosts
80.119.80.108 Sauvegarde
J'ai tenté ça:
sed -e"s/Sauvegarde/80.119.80.109 Sauvegarde/g" -i /etc/hosts;
Mais en résultat j'ai ça;
80.119.80.108 80.119.80.109 Sauvegarde
J'aurais voulu supprimer 80.119.80.108 mais je patine dans la sem....... J'y suis presque, mais une petite aide serait bienvenue.
Merci
--
Chercheur en améliorations.
[url]
4 réponses
La question porte sur le remplacement d'une IP dans le fichier hosts et la suppression de l'ancienne entrée, tout en préservant les autres lignes, via sed sur /etc/hosts. Plusieurs approches sont proposées, notamment sed -i pour remplacer l'adresse, des substitutions ciblant le nom d'hôte, ou l'ajout d'une nouvelle ligne lorsque l'entrée n'existe pas, avec ou sans sauvegarde. Des discussions mentionnent aussi les pièges liés aux séparateurs, aux espaces ou tabulations, aux variables shell et aux cas où l'entrée est présente dans plusieurs lignes, ce qui nécessite des conditions et des boucles simples.
-
Salut;
sed -i.bak '/Sauvegarde/{s/^[^ ]*/80.119.80.109/}' /etc/hosts
-
Si je l'incruste dans mon script avec des variables
sed -i.bak '/'$nameServeur'/{s/^[^ ]*/'$newIp'/}' /etc/hosts
j'obtiens 1 erreur sur le 1er caractère.sed -i.bak / 'MaMaison/{s/^[^ ]*/86.66.183.203/}' /etc/hosts
sed: -e expression n°1, caractère 1: expression régulière d'adresse inachevée
Il me semble pourtant avoir bien écrit.... -
Il y a un espace en trop dans le nom de ta variable $nameServeur ;-(
/ 'MaMaison/
$ name=" Sauvegarde";nip="80.119.80.109"
$ sed '/'${name}'/{s/^[^ ]*/'${nip}'/}' plop
sed: -e expression n°1, caractère 1: expression régulière d'adresse inachevée
$ name="Sauvegarde";nip="80.119.80.109"
$ sed '/'${name}'/{s/^[^ ]*/'${nip}'/}' plop
80.119.80.109 Sauvegarde -
-
-
-
-
Merci Zipe31. C'est toujours toi le grand spécialiste de bash....
Bonne soirée.
-
1 ligne de hosts est décomposée ainsi:
IP + TAB + hostname
Je pense que tout le problème consiste a inséré le TAB.
il parait qu'il y aurait plusieurs SED et ceux-ci ne gèrent pas tous le '\t'
http://sed.sourceforge.net/sed1line_fr.html -
-
J'ai adapté à mes variables. En fait ça n'écrit rien. Je n'ai que la relecture de mon fichier.
sed '/'${nameServeur}'/{s/^[^\t]*/'${newIp}'/}' $filehosts
ou $nameServeur = MaMaison
$newIp=80.119.80.109
$filehosts= /etc/hosts
Est ce le fait que la ligne contenant 'MaMaison' n'existe plus dans mon fichier.
En fait, je voudrais:
Si la ligne existe: La remplacer
Si elle n'existe pas: La créer.
Merci pour ton aide. C'est compliqué la commande sed... -
Salut,
Un exemple de fichier hosts sans l'entrée MaMaison$ cat mon_fich_hosts
80.119.80.108 Sauvegarde
Un exemple avec les 2 entrées$ cat mon_fich_maison
80.119.80.108 Sauvegarde
192.168.10.1 MaMaison
Le fichier de script pour sed :$ cat script.sed
/Sauvegarde/{
s/[^\t]*/80.119.80.109/
}
/MaMaison/{
s/[^\t]*/192.168.10.2/
b
}
$ {
a\192.168.10.2\tMaMaison
}
Le script exécuté sur le fichier sans occurrence de MaMaison :$ sed -f script.sed mon_fich_hosts
80.119.80.109 Sauvegarde
192.168.10.2 MaMaison
Le script exécuté sur le fichier ayant déjà les 2 occurrences$ sed -f script.sed mon_fich_maison
80.119.80.109 Sauvegarde
192.168.10.2 MaMaison -
OK, je vois qu'avec sed la solution existe. Donc pour intégrer cela dans mon script, j'ai fais ceci. Je n'ai pas de 2e fichier sed. J'intègre tout dans mon script.
sed -e '/'${nameServeur}'/{s/^[^\t]*/'${newIp}'/}';$ '{a\'${newIp}'\t'${nameServeur}'}' $filehosts
Le retour de la commande est+ sed -e '/MaMaison/{s/^[^\t]*/86.66.183.130/}'
^C
Comme tu le vois c'est bloquant. J'ai du terminer le script manuellement. Visiblement, le ";" ne semble pas être pris en compte. Pourtant j'ai suivi les conseils de https://openclassrooms.com/courses/la-commande-sed où ils disent bien que pour une commande uniligne, on sépare avec des ";"
Aurais je mal compris ?
-
-
Petit souci. Quand sed veut écrire
sed -i -e '/MaMaison/{s/^[^\t]*/86.66.183.119/}' -e b -e '$ a\86.66.183.119\tMaMaison' /etc/hosts
alors que la ligne n'existe pas dans le fichier hosts, il n'y met rien.
Je vois bien que b est sans les ' mais dans le script, ils y sont. C'est dans le résultat de la commande qu'ils disparaissent. J'ai donc remplacé les ' par des " mais rien n'y fait non plus. Serait ce la cause de la non écriture ?
Merci.
-
Effectivement, le post 29 fait également mention de la même chose et je t'avais répondu après. Ça fonctionne mais pas bien. Peut être faut-il faire 2 ligne sed avec une condition "if" ?
-
Pourtant…
L'entrée "MaMaison" n'existe pas et elle est rajoutée :$ cat hosts
80.119.80.108 Sauvegarde
$ sed -e '/MaMaison/{s/^[^\t]*/86.66.183.119/;b}' -e '$ a\86.66.183.119\tMaMaison' hosts
80.119.80.108 Sauvegarde
86.66.183.119 MaMaison
L'entrée "MaMaison" existe et elle est modifiée :$ cat maison
80.119.80.108 Sauvegarde
192.168.10.1 MaMaison
$ sed -e '/MaMaison/{s/^[^\t]*/86.66.183.119/;b}' -e '$ a\86.66.183.119\tMaMaison' maison
80.119.80.108 Sauvegarde
86.66.183.119 MaMaison
-