[sed] numéroter les substitutions

Résolu/Fermé
Utilisateur anonyme - 27 oct. 2005 à 00:53
 Utilisateur anonyme - 29 oct. 2005 à 18:17
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

7 réponses

mamiemando Messages postés 33077 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2024 7 748
27 oct. 2005 à 09:57
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
Utilisateur anonyme
28 oct. 2005 à 04:16
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
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
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
28 oct. 2005 à 18:52
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
Utilisateur anonyme
28 oct. 2005 à 23:20
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
28 oct. 2005 à 23:27
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
crabs Messages postés 908 Date d'inscription lundi 18 avril 2005 Statut Membre Dernière intervention 3 août 2008 506
28 oct. 2005 à 23:46
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
Utilisateur anonyme
29 oct. 2005 à 00:59
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
Utilisateur anonyme
29 oct. 2005 à 03:15
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
Utilisateur anonyme
29 oct. 2005 à 18:17
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