Forum Programmation.shell Doc sur sed

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
3
5
juin
2019

Bonjour,

J’ai lu une instruction sed dans ce type

sed -n "/$label/{:a;n;p;ba};" file

Je ne connais pas l’emploie des accolade avec les éléments à l’interieur.
A priori ça permet d’aller à la ligne contenant la valeur de la variable label …mais je n’en suis pas sure. Qulequ’un Pourrait il m’expliquer s’il vous plaît?

Merci

  • # man sed

    Posté par  . Évalué à 4.

    dans ton terminal favori, tapes

    man sed

    ca t'explique tout

    {      Begin a block of commands (end with a }).
    
    : label
           Label for b and t commands.
    
    n N
           Read/append  the  next line of input into the pattern space.
    
    p      Print the current pattern space.
    
    b label
                  Branch to label; if label is omitted, branch  to  end
                  of script.

    donc comme ca
    je dirais que ton script cherche le label,
    ouvre un label nommé 'a'
    lit la ligne suivant le label et l'ajoute au contenu (n)
    imprime le contenu (p)
    retourne en 'a' (ba)

    • [^] # Re: man sed

      Posté par  . Évalué à 3. Dernière modification le 06 juin 2019 à 09:02.

      C'est plus clair comme ça. Quoique…

    • [^] # Re: man sed

      Posté par  . Évalué à 1.

      Effectivement, ce qui m’embete C’est l’instruction a. Mais j ai testé avec autre chose et cela fonctionne.
      Je comprends en fait que le script ouvre le label qui est égale à la valeur de la variable label. Pour le reste ok.

      • [^] # Re: man sed

        Posté par  . Évalué à 2. Dernière modification le 06 juin 2019 à 19:48.

        :toto => je crees une reference toto (un label, mais comme tu as deja le label pour un autre usage)

        :btoto => je me branches sur cette reference

        • [^] # Re: man sed

          Posté par  . Évalué à 1.

          Oui mais pour que ce soit clair. Quand tu dis
          :Toto =>je crée une réf Toto dont la valeur vaut le contenu de la variable label qui est dans la 1er partie du sed.

          Si label=exemple
          sed -n "/$label/{:a;n;p;ba};"

          Alors dans la deuxième partie de l’instruction

          :a;ba ça se traduit par (je ne mets pas n et p qui sont claires)

          1/je crée une référence « exemple »
          2/je me branche à cette ref
          3/a est une valeur qui a peu d importance car on aurait pu écrire dans les accolades
          {:cequonveut;n;p;bcequonveut};

          • [^] # Re: man sed

            Posté par  . Évalué à 3.

            non pour moi ton $label et ton :a ne sont pas les memes

            $label est un motif que tu cherches dans ton fichier
            ton {:etiquette;n;p;betiquette} est l'action que tu vas faire quand tu trouves le $label

            si $label=exemple
            tu cherches le mot exemple dans le fichier, puis tu appliques l'action

            note cependant que je n'ai pas testé réellement le comportement de cette ligne,
            je le deduis simplement du manuel

  • # Explications accolades… et plus si affinité…

    Posté par  . Évalué à 1.

    Salut,

    Je ne connais pas l’emploie des accolade avec les éléments à l’interieur.
    A priori ça permet d’aller à la ligne contenant la valeur de la variable label

    Euh… non, pas exactement.

    Les accolades permettent d'assigner une ou plusieurs commandes à un motif donné.
    Dans ton exemple, les instructions contenues entre les accolades ne s'appliqueront qu'à la ligne ou qu'aux lignes contenant la valeur de la variable "${label}".

    D'autre part, l'instruction écrite tel quel n'a pas trop de sens, du moins au sens littéral, mais sans voir le fichier cible et sans connaître le but précis, difficile de l'expliquer.

    L'étiquette ":a" entre les accolades et suivie de l'instruction "n" (next) puis impression de ladite ligne et branchement à l'étiquette est quelque part absurde (sauf si c'est le but recherché), mais en gros cette syntaxe va cibler le motif recherché pour y appliquer les commandes comprises entre accolade, à savoir :

    1. :a = pose d'une étiquette de référence
    2. n = on vide le buffer (espace de travail) et on prend la ligne suivante
    3. p = on imprime la nouvelle ligne contenue dans le buffer
    4. ba = on se branche à l'étiquette et on recommence à appliquer les commandes n;p;ba;

    Et c'est là que ça foire (4), parce que à partir de là, le script va tout simplement imprimer chaque ligne restante jusqu'à la fin du fichier. Ce qui ne semble pas être le but final.

    Pour moi, il aurait fallu écrire :

    sed -n ':a;/motif/{n;p;ba};' file
    pour que ça ait un sens.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.