Next Previous Contents

12. Expressions régulières et sed

12.1 Les expressions régulières

Présentation

Une expression régulière (en anglais Regular Expression ou RE) sert à identifier une chaîne de caractère répondant à un certain critère (par exemple chaîne contenant des lettres minuscules uniquement). L'avantage d'une expression régulière est qu'avec une seule commande on peut réaliser un grand nombre de tâche qui seraient fastidieuses à faire avec des commandes UNIX classiques.

Les commandes ed, vi, ex, sed, awk, expr et grep utilisent les expressions régulières.

L'exemple le plus simple d'une expression régulière est une chaîne de caractères quelconque toto par exemple. Cette simple expression régulière va identifier la prochaine ligne du fichier à traiter contenant une chaîne de caractère correspondant à l'expression régulière.

Si l'on veut chercher une chaîne de caractère au sein de laquelle se trouve un caractère spécial (/, *, $, ., [, ], {, }, !, entre autres) (appelé aussi métacaractère), on peut faire en sorte que ce caractère ne soit pas interprété comme un caractère spécial mais comme un simple caractère. Pour cela vous devez le faire précéder par \ (backslash). Ainsi si votre chaîne est /dev, pour que le / ne soit pas interprété comme un caractère spécial, vous devez tapez \ /dev pour l'expression régulière.

Le métacaractère .

Le métacaractère . remplace dans une expression régulière un caractère unique, à l'exception du caractère retour chariot (\ n). Par exemple chaine. va identifier toutes les lignes contenant la chaine chaine suivit d'un caractère quelconque unique. Si vous voulez identifier les lignes contenant la chaîne .cshrc, l'expression régulière correspondante est \ .cshrc

Les métacaractères [ ]

Les métacaractères [] permettent de désigner des caractères compris dans un certain intervalle de valeur à une position déterminée d'une chaîne de caractères. Par exemple [Ff]raise va identifier les chaînes Fraise ou fraise, [a-z]toto va identifier une chaîne de caractère commençant par une lettre minuscule (intervalle de valeur de a à z) et suvi de la chaîne toto (atoto, btoto, ...., ztoto).

D'une manière plus générale voici comment [] peuvent être utilisés.

[A-D] intervalle de A à D (A, B, C, D) par exemple bof[A-D] donne bofA, bofB, bofC, bofD

[2-5] intervalle de 2 à 5 (2, 3, 4, 5) par exemple 12[2-5]2 donne 1222, 1232, 1242, 1252

[2-56] intervalle de 2 à 5 et 6 (et non pas 56) (2, 3, 4, 5, 6) par exemple 12[2-56]2 donne 1222, 1232, 1242, 1252, 1262

[a-dA-D] intervalle de a à d et A à D (a, b, c, d, A, B, C, D) par exemple z[a-dA-D]y donne zay, zby, zcy, zdy, zAy, zBy, zCy, zDy

[1-3-] intervalle de 1 à 3 et - (1, 2, 3, -) par exemple [1-3-]3 donne 13, 23, 33, -3

[a-cI-K1-3] intervalle de a à c, I à K et 1 à 3 (a, b, c, I, J, K, 1, 2, 3)

On peut utiliser [] avec un pour identifier le complèment de l'expression régulière. En français pour identifier l'opposé de l'expression régulière. Vous avez toujours pas compris ? Voici un exemple: [0-9]toto identifie les lignes contenant une chaîne toto, le caractère juste avant ne doit pas être un chiffre (exemple atoto, gtoto mais pas 1toto, 5toto). Autre exemple [a-zA-Z] n'importe quel caractère sauf une lettre minuscule ou majuscule. Attention à la place de , si vous tapez [1-3], c'est équivalent aux caractères 1, 2, 3 et .

Les métacaractères et $

Le métacaractère identifie un début de ligne. Par exemple l'expression régulière a va identifier les lignes commençant par le caractère a.

Le métacaractère $ identifie une fin de ligne. Par exemple l'expression régulière a$ va identifier les lignes se terminant par le caractère a.

L'expression régulière chaine$ identifie les lignes qui contiennent strictement la chaîne chaine.

L'expression régulière $ identifie une ligne vide.

Le métacaractère *

Le métacaractère * est le caractère de répétition.

L'expression régulière a* correspond aux lignes comportant 0 ou plusieurs caractère a. Son utilisation est à proscrire, car toutes les lignes, même celles ne contenant pas le caractère a, répondent aux critères de recherche. x* est une source de problèmes, il vaut mieux éviter de l'employer.

L'expression régulière aa* correspond aux lignes comportant 1 ou plusieurs caractères a.

L'expression régulière .* correspond à n'importe quelle chaîne de caractères.

L'expression régulière [a-z][a-z]* va chercher les chaînes de caractères contenant 1 ou plusieurs lettres minuscules (de a à z).

L'expression régulière [ ][ ]* est équivalent à tout sauf un blanc.

Les métacaractères \ ( \)

Pour le traitement complexe de fichier, il est utile parfois d'identifier un certain type de chaîne pour pouvoir s'en servir dans la suite du traitement comme un sous programme. C'est le principe des sous chaînes, pour mémoriser une sous chaîne, on utilise la syntaxe \ (expression régulière)\, cette sous chaîne sera identifié par un chiffre compris par 1 et 9 (suivant l'ordre de définition).

Par exemple \ ([a-z][a-z]*)\ est une sous chaîne identifiant les lignes contenant une ou plusieurs lettres minuscules, pour faire appel à cette sous chaîne, on pourra utiliser \ 1. Voir dans le paragraphe sed pour un exemple.

12.2 La commande sed

Présentation

sed est éditeur ligne non interactif, il lit les lignes d'un fichier une à une (ou provenant de l'entrée standard) leur applique un certain nombre de commandes d'édition et renvoie les lignes résultantes sur la sortie standard. Il ne modifie pas le fichier traité, il écrit tout sur la sortie standard.

sed est une évolution de l'éditeur ed lui même précurseur de vi, la syntaxe n'est franchement pas très conviviale, mais il permet de réaliser des commandes complexes sur des gros fichiers.

La syntaxe de sed est la suivante:

sed -e 'programme sed' fichier-a-traiter  
 

ou

sed -f fichier-programme fichier-a-traiter  
 

Vous disposez de l'option -n qui supprime la sortie standard par défaut, sed va écrire uniquement les lignes concernées par le traitement (sinon il écrit tout même les lignes non traitées). L'option -e n'est pas nécessaire quand vous avez une seule fonction d'édition.

La commande sed est une commande très riche, ne vous sont présentées ici que les fonctions les plus courantes, pour plus de détails faites un man sed et/ou man ed.

La fonction de substitution s

La fonction de substitution s permet de changer la première ou toutes les occurences d'une chaîne par une autre. La syntaxe est la suivante:

sed "s/toto/TOTO/" fichier va changer la première occurence de la chaîne toto par TOTO (la première chaîne toto rencontrée dans le texte uniquement)

sed "s/toto/TOTO/3" fichier va changer la troisième occurence de la chaîne toto par TOTO (la troisième chaîne toto rencontrée dans le texte uniquement)

sed "s/toto/TOTO/g" fichier va changer toutes les occurences de la chaîne toto par TOTO (toutes les chaînes toto rencontrées sont changées

sed "s/toto/TOTO/p" fichier en cas de remplacement la ligne concernée est affichée sur la sortie standard (uniquement en cas de substitution)

sed "s/toto/TOTO/w resultat" fichier en cas de substitution la ligne en entrée est inscrite dans un fichier résultat

La fonction de substitution peut évidemment être utilisée avec une expression régulière.

sed -e "s/[Ff]raise/FRAISE/g" fichier substitue toutes les chaînes Fraise ou fraise par FRAISE

La fonction de suppression d

La fonction de suppression d supprime les lignes comprises dans un intervalle donné. La syntaxe est la suivante:

sed "20,30d" fichier  
 

Cette commande va supprimer les lignes 20 à 30 du fichier fichier. On peut utiliser les expressions régulières:

sed "/toto/d" fichier  
 

Cette commande supprime les lignes contenant la chaîne toto. Si au contraire on ne veut pas effacer les lignes contenant la chaîne toto (toutes les autres sont supprimées), on tapera:

sed "/toto/!d" fichier  
 

En fait les lignes du fichier d'entrée ne sont pas supprimées, elles le sont au niveau de la sortie standard.

Les fonctions p, l, et =

La commande p (print) affiche la ligne sélectionnée sur la sortie standard. Elle invalide l'option -n.

La commande l (list) affiche la ligne sélectionnée sur la sortie standard avec en plus les caractères de contrôles en clair avec leur code ASCII (deux chiffres en octal).

La commande = donne le numéro de la ligne sélectionnée sur la sortie standard.

Ces trois commandes sont utiles pour le débogage, quand vous mettez au point vos programmes sed.

sed "/toto/=" fichier  
 

Cette commande va afficher le numéro de la ligne contenant la chaîne toto.

Les fonctions q, r et w

La fonction q (quit) va interrompre l'exécution de sed, la ligne en cours de traitement est affichée sur la sortie standard (uniquement si -n n'a pas été utilisée).

La fonction r (read) lit le contenu d'un fichier et écrit le contenu sur la sortie standard.

La fonction w (write) écrit la ligne sélectionnée dans un fichier.

sed "/^toto/w resultat" fichier  
 

Cette commande va écrire dans le fichier resultat toutes les lignes du fichier fichier commençant par la chaîne toto.

Les fonctions a et i

La fonction a (append) va placer un texte après la ligne sélectionnée. La syntaxe est la suivante:

a\   
le texte  
 

La fonction i (insert) va placer un texte avant la ligne sélectionnée. La syntaxe est la suivante:

i\   
le texte  
 

Si votre texte tient sur plusieurs lignes la syntaxe pour le texte est la suivante:

ligne 1 du texte\   
ligne 2 du texte  \      
ligne n du texte  \      
dernière ligne  
 

Concrètement vous pouvez appeler la fonction i ou a dans un fichier de commande de sed. Par exemple, soit votre fichier prog.sed suivant:

1i\   
début du traitement  
s/[tT]oto/TOTO/g  
$a  \     fin du traitement\    
de notre fichier  
 

On exécute la commande en tapant:

sed -f prog.sed fichier-a-traiter  
 

prog.sed a pour effet d'inscrire avant la première ligne (1i) le texte "début de traitement", et après la dernière ligne ($a) le texte "fin du traitement (retour à la ligne) de notre fichier".

sed et les sous chaînes

La commande:

sed -e "s/\  ([0-9][0-9]*\  )/aa\  1aa/" fichier  
 

La sous expression (sous chaîne) \ ([0-9][0-9]*\) désigne un ou plusieurs chiffres, chacun sera entouré des caractères aa. La chaîne to2to deviendra toaa2aato.


Next Previous Contents