Commande sed pour remplacer du texte

Résolu
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. Contributeur
    Salut;

    sed -i.bak '/Sauvegarde/{s/^[^ ]*/80.119.80.109/}' /etc/host
    s
    1
    1. 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. Contributeur
      @thierryR51Il 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. Merci Zipe31. Je n'arrête pas de te remercier.... Ça va finir par être lassant. ;)
      0
    4. Pourtant j'ai fait le nécessaire pour ne pas avoir ce blanc
      nameServeur=${Serveurname%% }

      mais il est encore là.
      0
    5. Contributeur
      @thierryR51A quoi ressemble la variable ${Serveurname} de départ ?
      0
  2. Merci Zipe31. C'est toujours toi le grand spécialiste de bash....
    Bonne soirée.
    0
    1. 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. Contributeur
      @thierryR51
      sed  '/Sauvegarde/{s/[^\t]*/80.119.80.109/}' /etc/hosts
      0
    3. 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. Contributeur
      @thierryR51Salut,

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