Ecrire à la fin d'une ligne ciblée sed

Résolu
Crisis66 Messages postés 6 Statut Membre -  
Crisis66 Messages postés 6 Statut Membre -
Bonjour,

Après plusieurs recherches un peu partout sur le web, j'ai décidé de passer par le forum.
J'ai dans un fichier quelque chose qui ressemble à ça:

define hostgroup{
hostgroup_name hello ; The name of the hostgroup
# alias hello ; Long name of the group
members membre1,membre2,membre3
}

j'aimerai savoir comment sed peu m'aider à partir d'un script à écrire par exemple un "membre4" à la fin de la ligne members.
Si vous pouvez m'aider je vous en remercie d'avance

2 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
     
    Bonjour

    Solution :

    Tu peux utiliser ceci, en supposant que ton texte soit stocké dans
    toto.txt
    :

    sed -i 's/\(.*members.*\)/\1,membre4/g' toto.txt


    Exemple :

    (mando@velvet) (~) $ cat toto.txt 
    define hostgroup{
    hostgroup_name hello ; The name of the hostgroup
    # alias hello ; Long name of the group
    members membre1,membre2,membre3
    }

    (mando@velvet) (~) $ sed -i 's/\(.*members.*\)/\1,membre4/g' toto.txt

    (mando@velvet) (~) $ cat toto.txt
    define hostgroup{
    hostgroup_name hello ; The name of the hostgroup
    # alias hello ; Long name of the group
    members membre1,membre2,membre3,membre4
    }


    Explication :

    sed attend un quadruplet de la forme 'operation/motif/remplacement/option' avec :
    - operation :
    s
    (search and replace)
    - option :
    g
    (global, ie appliqué à chaque morceau de ligne qui respecte le motif, on aurait pu ne rien mettre ici)

    Détaillons à présent le motif et le replacement.

    motif : Le but est de capturer toute la ligne contenant "members".
    -
    .*
    signifie n'importe quelle séquence de caractère (espaces compris)
    -
    \(...\)
    permet de mémoriser dans une variable (
    \1
    ) ce qui a été capturé par le motif entre ces 2 parenthèses. Ici on capture tout le motif mais on pourrait dans l'absolu capturer plusieurs sous motifs (qui seraient stockés dans
    \1
    ,
    \2
    , etc...)

    remplacement : on utilise le contenu de la variable
    \1
    auquel on ajoute le morceau de texte à ajouter à la suite (ici
    ,membre4
    ).

    Bonne chance
    0
    1. Crisis66 Messages postés 6 Statut Membre
       
      Je vois ce que tu veux faire, en effet cela fonctionne. j'ai oublié par contre de préciser que j'ai plusieurs members dans mon fichier. N'est-il pas possible de localiser la ligne ou se trouve le members que je veux et de lui dire d'écrire à la fin de cette ligne en particulier?
      Je te remercie de ton aide
      0
    2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 940
       
      De deux choses l'une :
      - soit tu veux corriger toutes les lignes contenant members, dans ce cas tu peux utiliser la commande que je te donne.
      - soit tu veux en modifier quelques une en particulier et il faut que le motif passé soit plus précis pour qu'il ne réagisse que sur les lignes que tu veux modifier.

      Si tu ne peux pas discriminer ces lignes des autres, tu peux utiliser
      vim
      . C'est la même syntaxe que
      sed
      .

      Concrètement :
      1) Lance la commande
      vim toto.txt
      :
      2) Appuie sur la touche Echap
      3) Tape
      :s/\(.*members.*\)/\1,membre4/gc
      ).

      Tu noteras que l'on a passé l'option
      c
      qui demande confirmation (non supportée dans
      sed
      ). Concrètement
      vim
      te demandera à chaque fois occurrence du motif trouvée si tu veux opérer le remplacement (y) ou pas (n).

      Tu peux aussi écrire un petit script
      awk
      si tu veux quelque chose de plus poussé (par exemple, pour réagir sur une motif et un numéro de ligne donné). Mais je ne pense pas que
      sed
      offre une syntaxe qui permette de le faire.

      Bonne chance
      0
      1. CépaMoi > mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Salut,

        sed -i.bak '/members/{s/$/,member4/}' fichier
        0
    3. Crisis66 Messages postés 6 Statut Membre
       
      ah en effet oui! merci beaucoup !
      0
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    hello
    n'ajoute ,member4 qu'à la fin des lignes qui commencent par members
    $ awk '/^members/ {$0=$0 ",member4"} {print}' fichier
    define hostgroup{
    hostgroup_name hello ; The name of the hostgroup
    # alias hello ; Long name of the group
    members membre1,membre2,membre3,member4
    }
    0
    1. Crisis66 Messages postés 6 Statut Membre
       
      merci dubcek, mais comme j'avais dis en commentaires plus haut, en faite j'ai plusieurs members dans mon fichier. Mais j'ai résolu le problème, j'ai pu faire une substitution à ma ligne et ça a fait exactement ce que je voulais faire. merci encore :)
      0
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
       
      quel est le critère pour savoir quel member ?
      0
    3. Crisis66 Messages postés 6 Statut Membre
       
      En faite j'ai fais selon le numéro de la ligne ou se trouve le member que je souhaite, je le recherche puis je le substitue
      0
    4. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
       
      si il est à la ligne 4, on peut faire
      awk '/^members/ && NR==4 {$0=$0 ",member4"} {print}' fichier
      0
    5. Crisis66 Messages postés 6 Statut Membre
       
      oui en effet
      0