Fonctionnement des expressions régulières
Les expressions régulières, ou regex, constituent un langage formel permettant de décrire des motifs de recherche dans des chaînes de caractères. Elles reposent sur des caractères ordinaires et des métacaractères aux significations spécifiques. Dans l'environnement shell, elles sont principalement utilisées avec des outils comme grep, sed et awk.
Deux variantes principales existent : les expressions régulières de base (BRE) et les expressions régulières étendues (ERE). Par défaut, grep utilise BRE ; pour activer ERE, l'option -E est requise.
Caractères de base et métacaractères
Les caractères ordinaires représentent des valeurs littérales, tandis que les métacaractères ont des fonctions spéciales. Voici une liste couramment utilisée dans les scripts shell :
.correspond à un caractère unique quelconque, sauf le saut de ligne.*indique zéro ou plusieurs occurrences du caractère précédent. Par exemple,ab*peut correspondre à "a", "ab" ou "abb".^et$ancrent le motif au début ou à la fin d'une ligne.[abc]correspond à l'un des caractères entre crochets.[^abc]correspond à tout caractère sauf ceux entre crochets.\{n,m\}spécifie une plage de répétitions (en BRE), tandis que{n,m}est utilisé en ERE.
Exemples pratiques avec grep
Considérons un fichier de configuration /etc/group pour illustrer l'application des regex :
Recherche de motifs simples :
$ grep admin /etc/group
admin:x:1000:user1
Utilisation du point pour correspondre à des caractères variables :
$ grep adm.n /etc/group
admin:x:1000:user1
Astérisque pour correspondances flexibles :
$ grep adm* /etc/group
admin:x:1000:user1
adm:x:50:daemon
Utilisation de crochets pour des plages de caractères :
$ grep [a-d] /etc/group
bin:x:1:daemon
daemon:x:2:bin
Répétitions avec des accolades :
# En BRE
$ grep 'a\{2\}' /etc/group
# En ERE avec l'option -E
$ grep -E 'a{2}' /etc/group
Expressions étendues et fonctionnalités avancées
Les ERE introduisent des opérateurs supplémentaires tels que :
+pour une ou plusieurs occurrences.?pour zéro ou une ocucrrence.|pour une alternative logique.()pour grouper des motifs.
Exemple avec des alternatives :
$ grep -E 'user1|user2' /etc/group
user1:x:1001:
user2:x:1002:
Les parenthèses permettent de capturer des sous-chaînes et de les réutiliser, par exemple avec sed :
$ echo "host-192.168.1.1" | sed -E 's/host-([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/server_\1/'
server_192.168.1.1
Classes POSIX et métacaractères étendus
Pour supporter des plages de caractères non anglais, POSIX définit des classes comme [:alpha:] pour les lettres ou [:digit:] pour les chiffres. Ces classes s'utilisent entre crochets :
$ grep '[[:digit:]]' /etc/group
games:x:60:
Avec grep -P, des séquences comme \d (chifrfes), \w (caractères alphanumériques) ou \s (espaces) sont disponibles pour des motifs perl-compatibles.
Application en combinaison avec d'autres outils
Les expressions régulières se combinent puissamment avec des commandes shell. Par exemple, extraire des adresses IP d'un fichier journal :
$ grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}' /var/log/auth.log
Remplacer des motifs avec sed :
$ sed -E 's/old_pattern/new_pattern/g' fichier.txt
Ces exemples illustrent la flexibilité des regex pour l'analyse et la transformation de données dans les scripts shell.