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 NeoX . Évalué à 4.
dans ton terminal favori, tapes
ca t'explique tout
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 papap . Évalué à 3. Dernière modification le 06 juin 2019 à 09:02.
C'est plus clair comme ça. Quoique…
[^] # Re: man sed
Posté par jb . É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 NeoX . É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 jb . É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 NeoX . É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 zipe31 . Évalué à 1.
Salut,
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 :
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 :
pour que ça ait un sens.sed -n ':a;/motif/{n;p;ba};' file
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.