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