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   -
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



--
Chercheur en améliorations.

[url]

4 réponses

Résumé de la discussion

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.

Bobot (l'IA à votre service)
  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut;

    sed -i.bak '/Sauvegarde/{s/^[^ ]*/80.119.80.109/}' /etc/host
    s
    1
    1. thierryR51 Messages postés 144 Statut Membre 8
       
      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
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501 > thierryR51 Messages postés 144 Statut Membre
       
      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
    3. thierryR51 Messages postés 144 Statut Membre 8
       
      Merci Zipe31. Je n'arrête pas de te remercier.... Ça va finir par être lassant. ;)
      0
    4. thierryR51 Messages postés 144 Statut Membre 8
       
      Pourtant j'ai fait le nécessaire pour ne pas avoir ce blanc
      nameServeur=${Serveurname%% }

      mais il est encore là.
      0
    5. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501 > thierryR51 Messages postés 144 Statut Membre
       
      A quoi ressemble la variable ${Serveurname} de départ ?
      0
  2. thierryR51 Messages postés 144 Statut Membre 8
     
    Merci Zipe31. C'est toujours toi le grand spécialiste de bash....
    Bonne soirée.
    0
    1. thierryR51 Messages postés 144 Statut Membre 8
       
      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
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501 > thierryR51 Messages postés 144 Statut Membre
       
      sed  '/Sauvegarde/{s/[^\t]*/80.119.80.109/}' /etc/hosts
      0
    3. thierryR51 Messages postés 144 Statut Membre 8
       
      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
    4. UnGnU Messages postés 1468 Statut Contributeur 158 > thierryR51 Messages postés 144 Statut Membre
       
      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
    5. thierryR51 Messages postés 144 Statut Membre 8
       
      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
  3. thierryR51 Messages postés 144 Statut Membre 8
     
    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
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      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
  4. thierryR51 Messages postés 144 Statut Membre 8
     
    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
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      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