[sed] numéroter les substitutions

Résolu
bonjour,

voilà, tout est dans le titre. Quelqu'un sait-il comment numéroter les substitutions dans une expression s///g ?

par exemple obtenir à partir de

echo pime pame poume | sed 's/m/W<le_machin>/g'

une sortie comme

piW1e paW2e pouW3e

où <le_machin> est justement la séquence d'échappement ou le bidule quelconque que j'ignore et qui permet cette numérotation

je tiens à sed parce qu'en l'occurrence c'est une substitution sur un espace motif multiligne (et ça je ne sais pas faire avec d'autres outils)

merci lézami

--
gnagnagna

7 réponses

  1. je suis en train de me rafraîchir un peu la mémoire avec perl et faut bien admettre, j'ai vraiment merdé :(

    je me rends compte que mon acharnement, même si j'ai appris quelques trucs, a été une énorme perte de temps. Comme quoi on peut arriver à ses fins (j'ai fait pas mal de scripts bash ces jours ci et à part celui-ci, les autres me donnent satisfaction), et malgré tout avoir échoué, parce qu'on s'est trompé d'outil.
    1. Salut,
      Passe en PERL, exemple cache_lien.pl
      #!/usr/bin/perl
      $i=1;
      while ( $ligne = <STDIN> )
          {
          $_ = $ligne ; $fin = $ligne ;
          while ( /https?:\S*/ )
              {
              $debut = $` ;
              $fin = $' ;
              print $debut,"[LIEN ",$i,"]" ;
              $_ = $fin ;
              $i++;
              }
          print $fin ;
          }
      

      Utilisation :
      cmd> chmod +x cache_lien.pl
      cmd> cat zob |  ./cache_lien.pl
      
      1. je crois que je vais faire ça, j'ai assez perdu de temps en obstinations térile

        d'autant que ça se passe de commentaire comme le passage à un langage un peu plus adapté simplifie manifestement la démarche, le script est simple et clair

        merci à tous :)

        (reste que ça de cloue le tru qu'il n'y ait pas de possibilité de numérotation des substitutions dans sed... oui je sais je radote un poil :D)
      2. il marche comme une fleur ton script crabs

        bon, il est temps que je me replonge dans perl ou peut-être même que je me colle à python

        j'ai bossé comme un porc
    2. mais j'arrive pas à croire qu'il n'existe aucune séquence permettant de récupérer le numéro de la substitution. Sinon ben c'est à graver au burin dans la toudouliste de sed :)
      1. non c'est pas tout à fait la voie que je cherche

        je suis quasiment certain que le drapeau e de la commande s peut me permettre d'y arriver, je touche un peu le truc des doigts, je m'éloigne à nouveau, je reviens, mais pas moyen d'avoir le truc pile

        à chaque fois, un truc cloche

        ça doit se jouer en un cocktail inspiré de ça

        cat zub |sed 's/^/echo /'| sed -re ':a;N;$!ba' -e 's/m/;let i++;echo -n "<G$i>"/egm'

        cat zub |sed 's/^/echo -n /'| sed -re ':a;N;$!ba' -e 's/m(.*)$/;let i++;echo "<G$i>\1"/egm'

        cat zub |sed 's/^/echo -n /'| sed -re ':a;N;$!ba' -e 's/m([^m]*)$/;let i++;echo "<G$i>\1"/egm'

        à un moment j'ai presque tenu mon affaire avec ça

        $ cat doubidule
        #!/bin/sh
        sed \
            -e "s/'/\\\'/g" \
            -e "s/(/\\\(/g" \
            -e "s/)/\\\)/g" \
            -e 's/"/\\\"/g' \
            -e 's/\\$/./g' \
        | sed -r \
            -e ':a;N;$!ba' \
            -e 's#https?://[^ \n]+($| )#LIEN\1#gm' \
            -e 's/^/:::/gm' \
            -e 's#(^|LIEN)#true;let i++;echo -n "[\1 $i]"#egm' \
        | sed -r \
            -e 's/true//g' \
            -e 's/\[ [0-9]+\]:::/\n/g' \
            -e 's/\[LIEN [0-9]+\]/^[[41m&^[[49m/g'
        
        $ cat zob
        on trouve sur http://www.rotten.com le pire ramassis de résidus putrides de
        sous-chiottes, mais sur http://www.caramail.com ou sur http://www.msn.com par
        exemple, ça rivalise. Par contre, sur
        http://www.c-est-la-fete-du-slip-en-charente-poitou-vendee.com
        on trouve vraiment de quoi se distraire le bulbe ainsi que quelques bonnes
        recette de crevettes qui rivalisent avec http://www.bonnesoupe.fr
        c'est presque aussi bon que "Chez Paulette".
        http://www.bolino.com par contre est vraiment dégueulasse
        (c'est terrible)
        
        $ cat zob | ./doubidule
        
        on trouve sur [LIEN 2] le pire ramassis de résidus putrides de
        sous-chiottes, mais sur [LIEN 4] ou sur [LIEN 5] par
        exemple, ça rivalise. Par contre, sur
        [LIEN 8]
        on trouve vraiment de quoi se distraire le bulbe ainsi que quelques bonnes
        recette de crevettes qui rivalisent avec [LIEN 11]
        c'est presque aussi bon que "Chez Paulette".
        [LIEN 14] par contre est vraiment dégueulasse
        (c'est terrible)
        


        avec les zolies couleurs et tout. Bon j'ai bossé comme un goret, insérer des trucs pour les enlever ensuite c'est dégueulasse.

        Mais bon, après les affichages pourraves de mes commandes du dessus j'étais content, jusqu'à ce que d'un coup je me rappelle (en le voyant) que pour contourner un problème j'avais aussi substitué le caractère de début de ligne (le flag e est vraiment casse-burnasses) et que je devais maintenant m'occuper de ça, vu que chaque ligne incrémente le compteur, en l'état

        bon, c'est juste pour un preview de mail donc je crois VRAIMENT que je vais arrêter de me bouffer du temps là dessus :D

        C'est typique, ça te prends comme ça, tu veux faire un truc minuscule genre qui fait pinpon guili et paf, tu te retrouves à coder deux semaines en bash pour que le guili débeugler le bras automatique qui te chatouille quand le machin fait guili

        chuis malade :(
        1. Modérateur
          Tè la commande de "gregregre" revue pour l'incrémentation :
          [jp@Mandrake tmpfs]$ cat fich
          pime
          pame
          poume
          puma pomu pima
          pome pyme plume
          tomahawk tomate tomette
          thomas
          
          [jp@Mandrake tmpfs]$ c=1 && for i in `cat fich`; do echo $i | sed "s/m/W$c/g" && c=$(expr $c + 1); done
          piW1e
          paW2e
          pouW3e
          puW4a
          poW5u
          piW6a
          poW7e
          pyW8e
          pluW9e
          toW10ahawk
          toW11ate
          toW12ette
          thoW13as
          [jp@Mandrake tmpfs]$
          A marche ;-)))
          1. c=1 && for i in pime pame poume ; do echo $i | sed "s/m/W$c/g" && c=$c+1 ; done

            ou quelque chose dans le style ça doit passer
            sauf que la variable dans sed je crois me rappeler que c'est une syntaxe speciale mais là j'ai pas de machine unix pour tester....

            regarde le man page de sed pour voir comment envoyer le $c dans la commande interne de sed
            1. Modérateur
              Et pourquoi ne pas faire un petit programme python (ou perl) avec une petite boucle incrementant le compteur à chaque substitution ?
              http://docs.python.org/lib/re-syntax.html

              Si tu tiens vraiment à le faire sans faire de script tu peux le faire en perl.

              Bonne chance
              1. ben c'est-à-dire qu'en fait c'était juste un petit luxe que je voulais m'offrir, dans l'hypothèse où je puisse aménager mon script tel qu'il est, donc si une séquence d'échappement avait existé.

                le problème c'est qu'en fait je pars toujours de tout petits besoins, pour lesquels je fais un petit script bash, puis l'envie me vient de le fignoler ça et là.

                C'est au départ que j'aurais dû adopter perl ou, en effet, python, mais je ne me sentais pas trop l'envie ni le temps de me familiariser avec un langage (ou de me le rappeler, pour perl, vu que je ne l'ai utilisé véritablement qu'il y a facilement deux ou trois ans) pour des besoins vraiment limités.

                bon, si la solution avait pu s'insérer dans ce que j'ai déjà fait, ça m'aurait arrangé, mais je n'en ai pas assez besoin pour refuser de le sacrifier

                cela dit, si je n'arrête pas vite fait de pondre des scripts, il va vraiment falloir que je passe à autre chose (et python est un bon candidat)

                merci pour ta réponse