Commande sed pour remplacer du texte
Résolu
thierryR51
Messages postés
144
Statut
Membre
-
zipe31 Messages postés 34620 Date d'inscription Statut Contributeur Dernière intervention -
zipe31 Messages postés 34620 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
J'essaie de remplacer une IP dans le fichier host
J'ai tenté ça:
Mais en résultat j'ai ça;
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]
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
-
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
-