Regulars expressions Expressions régulières Expressions rationnelles Regex | regexp Une notation permettant de décrire des chaînes de caractère, en gros : - de répérer des schémas donnés de chaîne de caractères - de les manipuler - (d'impressioner|de traumatiser) (sa copine|ses copains|son patron) Opérateurs de base : ^ : le début d'une chaîne, $ : la fin . : un caractère quelconque a* : 'a' zéro ou plusieurs fois b+ : 'b' une ou plusieurs fois .? : n'importe quel caractère zéro ou une fois Les grands classiques : verbes en 'er' - er$ exemple : donner, casser, ... les dérivés de 'absol' - ^absol absolument, absolution, ... les mots en ***ll*nt$ - .*ll.nt$ allant, aillent, verrouillent, ... Trouver les paquets désinstallés mais dont il reste des fichiers de configuration $ dpkg -l | grep ^rc si vous voulez tester, par exemple : $ grep '^.*eu[xt]$' /usr/share/dict/french pour trouver les noms de domaines en .eu ayant un sens en français les groupements : [] et () comme on a pu le voir pour grep '^.*eu[xt]$' on peut utiliser les [] pour des groupements les jeux sous gnome ou kde $ apt-cache search games | grep '^[gk].*' méthode non infaillible évidemment; mais c'est un exemple :p on peut aussi parler de ^ dans un groupement pour l'inverse les jeux ni sous gnome, ni sous kde $ apt-cache search games | grep '^[^gk].*' | grep -v '^lib' ici on utilise l'option -v de grep pour ne PAS sortir les lignes qui commencent par lib autre exemple, les lignes qui ne contiennent que des lettres ou chiffres $ grep '[a-zA-Z0-9]' un_fichier_texte le groupement () au cas d'expressions 'complexes' que l'on voudrait isoler $ ls / | grep -E '^m(edia|root)' -> media on cherche une chaîne qui commence par 'm' suivi de 'edia' OU 'root' donc on cherche ce qui commence par 'media' OU 'mroot' si on avait fait $ ls / | grep -E '^media|root' -> media, root on aurait cherché une chaîne commençant par 'media' OU 'root' D'autres outils existent, nous allons en parler brièvement maintenant sed prend des arguments sous la forme sed -e 'expression' [-e 'expression] [fichier] ou bien echo "du texte" | sed 'une_seule_expression' On peut procéder à des remplacements, substitutions avec sed (s/pattern/subst/) $ echo "remi.laurent@gmail.com" | sed 's/@/ at /' | sed 's/\./ pOiNt /' -> remi pOiNt laurent at gmail.com on effectue deux changements, et on 'pipe' l'un dans l'autre, de la plomberie ici, on ne remplace que la première occurence, donc, une variante $ echo "remi.laurent@gmail.com" | sed -e 's/@/ at /' -e 's/\./ pOiNt /g' -> remi pOiNt laurent at gmail pOiNt com ici on donne plusieurs expressions à sed on doit échaper le caractère '.' pour qu'il ne soit pas interprété On peut procéder à des substitutions plus évoluées ( -r -regexp-extended ) $ echo "remi.laurent@gmail.com" | sed -r -e 's/gmail/googlemail/' -e 's/(.*)\.(.*)@(.*)/\2.\1@\3/' -> laurent.remi@googlemail.com on change gmail en googlemail et on 'inverse autour' du point de remi.laurent foo.bar@foobar.com -> bar.foo@foobar.com gmail.baz@fgmail.com -> baz.googlemail@gmail.com (une seule fois, pas de 'g') Un autre outil qui pourrait vous servir (installé avec perl) : rename des mp3 à trier : Knoklezout_au_taquet-Jamendo-David_TMX.mp3 etc ... rename 's/^(.*)-Jamendo-(.*)\.mp3/$2_-_$1.mp3/' *.mp3 -> David_TMXr_-_Knoklezout_au_taquet.mp3 On remarque donc que (selon les cas) $x \x permet de réinjecter des expressions mises entres parenthèses Bon, vous l'aurez compris, les expressions rationnelles on peut en parler des heures J'espère ne pas vous avoir dégoûté avec cet aperçu rapide mais assez complet. Pour vous donner l'eau à la bouche, voilà une liste non exhaustive des applications qui intègrent les regexp Programmation : en natif, Perl, Ruby, Python, et aussi PHP, Java, C, C++ etc ... Programmes : sed, awk, grep, vim, rename, ... Filtres : apache & lighttpd (mod_rewrite, vhosts, ...), adblock (firefox), ... Quelques références qui pourraient vous aider : Une introduction à Perl et une introduction au regexp : http://sylvain.lhullier.org/publications/perl.html (FR) Le livre de référence (édition 1) de Ruby avec une petite partie sur les regexp http://rubycentral.com/book/language.html (EN) Une approche plus théorique et (donc) moins marrante avec Python: http://www.amk.ca/python/howto/regex/ (EN) Une introduction rapide réalisée dans notre FSUG (merci à Krunch) : http://www.fsugar.be/docu/regex/regex.html (FR) Si vous avez des questions, je suis prêt, ce n'est pas pour autant que je pourrai y répondre à chaque fois :p