Commande sed pour remplacer du texte

Résolu/Fermé
thierryR51 Messages postés 139 Date d'inscription dimanche 5 juillet 2015 Statut Membre Dernière intervention 22 juin 2021 - 17 juin 2016 à 20:04
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 - 23 déc. 2016 à 10:16
Bonjour,
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




4 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
17 juin 2016 à 20:13
Salut;

sed -i.bak '/Sauvegarde/{s/^[^ ]*/80.119.80.109/}' /etc/host
s
1
thierryR51 Messages postés 139 Date d'inscription dimanche 5 juillet 2015 Statut Membre Dernière intervention 22 juin 2021 8
17 juin 2016 à 23:51
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....
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407 > thierryR51 Messages postés 139 Date d'inscription dimanche 5 juillet 2015 Statut Membre Dernière intervention 22 juin 2021
18 juin 2016 à 07:40
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
0
thierryR51 Messages postés 139 Date d'inscription dimanche 5 juillet 2015 Statut Membre Dernière intervention 22 juin 2021 8
18 juin 2016 à 09:41
Merci Zipe31. Je n'arrête pas de te remercier.... Ça va finir par être lassant. ;)
0
thierryR51 Messages postés 139 Date d'inscription dimanche 5 juillet 2015 Statut Membre Dernière intervention 22 juin 2021 8
18 juin 2016 à 09:49
Pourtant j'ai fait le nécessaire pour ne pas avoir ce blanc
nameServeur=${Serveurname%% }

mais il est encore là.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407 > thierryR51 Messages postés 139 Date d'inscription dimanche 5 juillet 2015 Statut Membre Dernière intervention 22 juin 2021
18 juin 2016 à 09:50
A quoi ressemble la variable ${Serveurname} de départ ?
0
thierryR51 Messages postés 139 Date d'inscription dimanche 5 juillet 2015 Statut Membre Dernière intervention 22 juin 2021 8
17 juin 2016 à 20:26
Merci Zipe31. C'est toujours toi le grand spécialiste de bash....
Bonne soirée.
0
thierryR51 Messages postés 139 Date d'inscription dimanche 5 juillet 2015 Statut Membre Dernière intervention 22 juin 2021 8
28 juin 2016 à 22:08
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
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407 > thierryR51 Messages postés 139 Date d'inscription dimanche 5 juillet 2015 Statut Membre Dernière intervention 22 juin 2021
28 juin 2016 à 22:19
sed  '/Sauvegarde/{s/[^\t]*/80.119.80.109/}' /etc/hosts
0
thierryR51 Messages postés 139 Date d'inscription dimanche 5 juillet 2015 Statut Membre Dernière intervention 22 juin 2021 8
Modifié par thierryR51 le 29/06/2016 à 23:12
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...
0
UnGnU Messages postés 1158 Date d'inscription lundi 2 mai 2016 Statut Contributeur Dernière intervention 22 décembre 2020 157 > thierryR51 Messages postés 139 Date d'inscription dimanche 5 juillet 2015 Statut Membre Dernière intervention 22 juin 2021
30 juin 2016 à 13:40
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
0
thierryR51 Messages postés 139 Date d'inscription dimanche 5 juillet 2015 Statut Membre Dernière intervention 22 juin 2021 8
30 juin 2016 à 21:28
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 ?
0
thierryR51 Messages postés 139 Date d'inscription dimanche 5 juillet 2015 Statut Membre Dernière intervention 22 juin 2021 8
23 déc. 2016 à 00:21
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.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
23 déc. 2016 à 09:53
Salut,

Essaye comme ça :
sed -i -e '/MaMaison/{s/^[^\t]*/86.66.183.119/;b}' -e '$ a\86.66.183.119\tMaMaison' /etc/hosts
0
thierryR51 Messages postés 139 Date d'inscription dimanche 5 juillet 2015 Statut Membre Dernière intervention 22 juin 2021 8
23 déc. 2016 à 10:10
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" ?
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
23 déc. 2016 à 10:16
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
0