[Linux-31] Une question à propos de rename (ou de perl)

jpcas jpcas at free.fr
Jeu 24 Mar 17:28:12 CET 2016


Le 23/03/2016 22:51, claude Micouin a écrit :
> Ça marche. Impec !
> 
> 
> Juste pour comprendre, c'est quoi la syntaxe de tout ça?
> 's/^.*_([^_]*_)/$1/'
> 
> Merci.

De rien.

Alors, rien de bien sorcier. C'est quasiment la même syntaxe que pour
sed (dont je suis plus habitué qu'avec perl).

Donc même syntaxe que pour sed :

s/motif/remplacement/
Ça je suppose que tu connais. On remplace tout ce qui concerne la partie
gauche (motif) par la partie droite (remplacement.

^.*_
Là on joue sur la gourmandise des regex et on prend tout (.*) ce qui
commence en début de ligne (^) jusqu'au dernier caractère underscore
(_). Mais c'est là que le bât blesse. Si on n'avait mis que ça dans la
regex du motif, la gourmandise des regex aurait tout pris jusqu'au
dernier underscore sur la ligne. D'où l'expression suivante.


([^_]*_)
Les parenthèses signifient qu'on délimite un sous-ensemble, qui servira
de référence arrière par la suite.
Donc, on recherche tout caractère à l'exception d'un underscore. Le [^_]
désigne la négation. Dans ton cas, le motif du sous-ensemble ressemblera
à "Problemes_". Ce qui empêche l'expression précédente d'englober tout
jusqu'au dernier underscore.

$1
Ça c'est la référence-arrière, qui fait référence au sous-ensemble
précédent (la partie entre parenthèses). On la remet en place sans le
début de la ligne. S'il y avait eu plusieurs sous-ensembles dans
l'expression, ils auraient été nommés dans l'ordre d'apparition $2, $3,
$4, etc.


Je ne sais pas si c'est bien clair, mais des fois ce n'est pas évident
d'expliquer certaines choses ;-\

Voilà.

@+.

JP



Plus d'informations sur la liste de diffusion Linux-31