[sed] numéroter les substitutions

Résolu
Utilisateur anonyme -  
 Utilisateur anonyme -
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. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    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
    0
    1. Utilisateur anonyme
       
      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
      0
  2. gregregre
     
    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
    0
  3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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 ;-)))
    0
  4. Utilisateur anonyme
     
    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 :(
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Utilisateur anonyme
     
    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 :)
    0
  7. crabs Messages postés 909 Statut Membre 507
     
    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
    
    0
    1. Utilisateur anonyme
       
      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)
      0
    2. Utilisateur anonyme
       
      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
      0
  8. Utilisateur anonyme
     
    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.
    0