Expressions régulières dans le shell pour la manipulation de texte

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.

Étiquettes: Shell regex BRE ERE POSIX

Publié le 23 juin à 23h56