sed

Comment perdre son temps avec une regex?

En étant sûr de ce que l'on tape....

Prenez un geek voulant bien faire les choses et se taper un peu de sed pour faire de la substitution. Il pense connaitre à peu prés le fonctionnement des expressions régulières et fini par produire assez rapidement quelque chose qui ressemble à cela (le contenu du fichier ldif_file n'a pas d'importance en lui même):

$ sed -e "s/dn: uid=(a-z*),ou=Peoples.*/\1/g" ldif_file

Tout cela lui semble lipide ; même le fait qu'il n'utilise pas sciemment le quantificateur paresseux ? sur l'expression [a-z\]*, l'enchainement classe de caractère [a-z\] et caractère , faisant son boulot correctement. Et pourtant....

sed: -e expression #1, char 36: invalid reference \1 on `s' command's RHS

Et il ne comprend pas ce qui lui arrive. [a-z\]*, est pourtant bien reconnu! Regexxer lui indique pourtant que tout est OK.

S'il savait tout paraitrait plus simple....

Il consulte alors son ami geek en quête d'une explication... Et la lumière fut:

$ sed -e "s/dn: uid=\(a-z*\),ou=Peoples.*/\1/g"

Oui, oui , les parenthèses capturantes doivent être échappées avec sed. Il en est de même avec GNU Emacs, sed, vi et grep. Pour tous les autres moteurs de regex le bonne vieille syntaxe (..) reste d'actualité.

Verdict : un geek se doit d'avoir toujours un ami geek sous la main