goto label dans un bloc sed

Daniel Caillibaud ml.dcailli at free.fr
Tue Oct 24 14:17:46 CEST 2006


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


More information about the Shell mailing list