goto label dans un bloc sed
Bonjour, Je m'essaie à un script sed un peu plus élaboré que d'habitude (je ne le met pas ici car long) et je n'arrive pas à faire un branchement dans un bloc d'instructions. par exemple /pattern/ { # instructions diverses /pattern2/ ! b label } : label # autres instructions ne marche pas, pas plus que /pattern/ { # instructions diverses : label # autres instructions /pattern2/ ! b label } le branchement n'a pas lieu, ça sort du script à la rencontre de 'b label' (je suis sûr que je passe dans le bloc et que pattern2 est vérifié en remplaçant 'b label' par '=' pour afficher le n° de ligne). Un moyen de contourner ça ? Merci Daniel
On Tue, Oct 24, 2006 at 10:33:03AM +0200, Daniel Caillibaud wrote:
Bonjour,
Je m'essaie à un script sed un peu plus élaboré que d'habitude (je ne le met pas ici car long) et je n'arrive pas à faire un branchement dans un bloc d'instructions.
par exemple
/pattern/ { # instructions diverses /pattern2/ ! b label } : label # autres instructions
Qu'on soit bien d'accords, le script est exécuté entièrement sur chaque ligne... Donc si la ligne qui ne matche pas /pattern2/ ne matche pas /pattern/ avant, le branch ne sera jamais exécuté. Si tu veux "fetcher" les lignes suivantes dans ton bloc, utilise la commande "n / N", et le "hold space". Le script est vraiment trop long pour l'envoyer sur la liste avec un exemple de données en attachement ? PS: Je suis un peu polio pour poster sur cette liste, d'où le délai, désolé :-) -- /// Stephane Jourdois /"\ ASCII RIBBON CAMPAIGN \\\ ((( Consultant securite \ / AGAINST HTML MAIL ))) \\\ 24 rue Cauchy X /// \\\ 75015 Paris / \ +33 6 8643 3085 ///
Daniel Caillibaud a écrit :
Bonjour,
Je m'essaie à un script sed un peu plus élaboré que d'habitude (je ne le met pas ici car long) et je n'arrive pas à faire un branchement dans un bloc d'instructions.
Bon, j'avais une erreur qqpart (je sais pas où car j'ai réécrit pas mal de trucs et j'ai pas gardé la version qui marchait pas), maintenant ça marche très bien... Désolé pour le bruit. Daniel
On mar 24 octobre, Daniel Caillibaud wrote:
Je m'essaie à un script sed un peu plus élaboré que d'habitude (je ne le met pas ici car long) et je n'arrive pas à faire un branchement dans un bloc d'instructions.
Bon, j'avais une erreur qqpart (je sais pas où car j'ai réécrit pas mal de trucs et j'ai pas gardé la version qui marchait pas), maintenant ça marche très bien...
Tu veux pas décrire ton code qui marche ? :P (par mail ou mieux sur le wiki)
Désolé pour le bruit.
Pas de souci -- http://asyd.net/home/ - Home Page http://guses.org/home/ - French Speaking (Open)Solaris User Group
Bruno Bonfils a écrit :
Tu veux pas décrire ton code qui marche ? :P (par mail ou mieux sur le wiki)
Je ne sais pas si ça a grand intérêt sur le wiki, je le mets si tu veux... Le pb de départ (pas le mien, sur une autre ml) était d'afficher le 2e bloc /$var/,/^$/, où $var est une variable du shell. J'ai trouvé un truc vite fait et pas beau, et je me suis demandé comment faire pour avoir le i eme bloc plus proprement. La réponse suit, mais je pense que ça irait beaucoup plus vite avec autre chose que sed, qui saurait gérer des variables (awk, perl, etc...), donc ce n'est pas très intéressant sur le wiki. Avec sed, ça donne un fichier sed template qu'il faut modifier (avec sed) depuis le shell pour y mettre les variables qui vont bien. Ca donne ce qui suit #### début script.tpl.sed #### #! /bin/sed -nf # template de script sed pour afficher le n ieme # bloc /patternDebut/,/patternFin/ # pour le 4e bloc /patternDebut/,/patternFin/ lancer : # sed -e '2,7 d; s#/patternDebut/#/monVraiPatternDeDebut/#; s#/patternFin/#/monVraiPatternDeFin/#; s#/occ=X/#/occ=4/#' <script.tpl.sed >script.sed # on efface jusqu'au pattern de début /patternDebut/ ! d /patternDebut/ { # on passe au buffer2 pour compter x # si buffer 2 vide on initialise à 0 s/^$/occ=0/ # on incremente s/occ=8/occ=9/ s/occ=7/occ=8/ s/occ=6/occ=7/ s/occ=5/occ=6/ s/occ=4/occ=5/ s/occ=3/occ=4/ s/occ=2/occ=3/ s/occ=1/occ=2/ s/occ=0/occ=1/ x } # on regarde si on est au n ieme x /occ=X/ { x : afficher p n /patternFin/ ! b afficher # on affiche aussi la ligne avec le pattern de fin p # et on arrête là q } x # sinon on efface cette ligne et on repart au debut du script avec la ligne suivante du fichier d'entrée d #### fin script.tpl.sed #### #### début sample.txt #### 1 bla 3 pattern 4 blabla 5 bloblo 7 blablabla 9 pattern 10 blublu 12 reblabla 14 pattern 15 blibli 17 derniere ligne #### fin sample.txt #### et on peut tester pour le 3e bloc /pattenr/,/^$/ avec debut='/pattern/'; fin='/^$/'; num=3; \ sed -e '2,7 d; s#/patternDebut/#'$debut'#; s#/patternFin/#'$fin'#; s#/occ=X/#/occ='$num'/#' <script.tpl.sed >script.sed; chmod +x script.sed ./script.sed <sample.txt Bon, ça m'a au moins permis de comprendre un peu mieux comment fonctionne sed ;-) Daniel
Daniel Caillibaud a écrit :
Daniel Caillibaud a écrit :
Bonjour,
Je m'essaie à un script sed un peu plus élaboré que d'habitude (je ne le met pas ici car long) et je n'arrive pas à faire un branchement dans un bloc d'instructions.
Bon, j'avais une erreur qqpart
Je pense que j'ai fait un truc très très con mais qui pourrait arriver à d'autres... : pour debugger mon script, j'ai dû ajouter un p et mon pattern2 ne matchait plus (car imprimé et donc passage à la ligne suivante du fichier d'entrée avant le test). Je pensais pourtant avoir juste changé le b par un = et avoir vu passer le n° de ligne, mais j'ai dû rêver... Daniel
Bonjour a tous Je rentre d'un long voyage, d'ou mon retard, Daniel Caillibaud a écrit a propos de sed: [couic]
Je pense que j'ai fait un truc très très con mais qui pourrait arriver à d'autres... : pour debugger mon script, j'ai dû ajouter un p et mon pattern2 ne matchait plus (car imprimé et donc passage à la ligne suivante du fichier d'entrée avant le test).
ceci est une baitise. la commande p ne provoque pas le passage a la ligne suivante. pour preuve : echo 'coucou blqblq kldjlsk toto qqq ' | sed -e '/toto/{ p s/toto/tata/ } ' reponse : coucou blqblq kldjlsk toto qqq kldjlsk tata qqq
Christophe Martin a écrit :
Bonjour a tous
Je rentre d'un long voyage, d'ou mon retard,
Daniel Caillibaud a écrit a propos de sed: [couic]
Je pense que j'ai fait un truc très très con mais qui pourrait arriver à d'autres... : pour debugger mon script, j'ai dû ajouter un p et mon pattern2 ne matchait plus (car imprimé et donc passage à la ligne suivante du fichier d'entrée avant le test).
ceci est une baitise. la commande p ne provoque pas le passage a la ligne suivante.
Effectivement, j'ai écrit une grosse bêtise, merci d'avoir rectifié. Sauf que je comprend toujours pas pourquoi mon 1er essai marchait pas, mais comme je l'ai plus sous la main... Daniel
participants (4)
-
Bruno Bonfils
-
Christophe Martin
-
Daniel Caillibaud
-
Stephane Jourdois