Vous êtes sur la page 1sur 7

Expressions rgulires et sed

Les expressions rgulires

Prsentation

Une expression rgulire (en anglais Regular Expression ou RE) sert identifier une chane de
caractre rpondant un certain critre (par exemple chane contenant des lettres minuscules
uniquement). L'avantage d'une expression rgulire est qu'avec une seule commande on peut
raliser un grand nombre de tche qui seraient fastidieuses faire avec des commandes UNIX
classiques.

Les commandes ed, vi, ex, sed, awk, expr et grep utilisent les expressions rgulires.

L'exemple le plus simple d'une expression rgulire est une chane de caractres quelconque toto
par exemple. Cette simple expression rgulire va identifier la prochaine ligne du fichier traiter
contenant une chane de caractre correspondant l'expression rgulire.

Si l'on veut chercher une chane de caractre au sein de laquelle se trouve un caractre spcial (/, *,
$, ., [, ], {, }, !, entre autres) (appel aussi mtacaractre), on peut faire en sorte que ce caractre ne
soit pas interprt comme un caractre spcial mais comme un simple caractre. Pour cela vous
devez le faire prcder par \ (backslash). Ainsi si votre chane est /dev, pour que le / ne soit pas
interprt comme un caractre spcial, vous devez tapez \ /dev pour l'expression rgulire.

Le mtacaractre .

Le mtacaractre . remplace dans une expression rgulire un caractre unique, l'exception du


caractre retour chariot (\ n). Par exemple chaine. va identifier toutes les lignes contenant la chaine
chaine suivit d'un caractre quelconque unique. Si vous voulez identifier les lignes contenant la
chane .cshrc, l'expression rgulire correspondante est \ .cshrc

Les mtacaractres {}

Les intervalles de reconnaissance

a{3} correspond exactement aaa


a{2,} correspond un minimum de deux a conscutifs
soit aa, aaa, aaaaa....
a{2,4} correspond uniquement aa, aaa, aaaa

Les mtacaractres [ ]

Les mtacaractres [] permettent de dsigner des caractres compris dans un certain intervalle
de valeur une position dtermine d'une chane de caractres. Par exemple [Ff]raise va
identifier les chanes Fraise ou fraise, [a-z]toto va identifier une chane de caractre commenant
par une lettre minuscule (intervalle de valeur de a z) et suvi de la chane toto (atoto, btoto, ....,
ztoto).

D'une manire plus gnrale voici comment [] peuvent tre utiliss.

[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 complment de l'expression rgulire.

En franais pour identifier l'oppos de l'expression rgulire.

Voici un exemple: [^0-9]toto identifie les lignes contenant une chane toto, le caractre juste avant
ne doit pas tre un chiffre (exemple atoto, gtoto mais pas 1toto, 5toto). Autre exemple [^a-zA-Z]
n'importe quel caractre sauf une lettre minuscule ou majuscule. Attention la place de ^, si vous
tapez [1-3^], c'est quivalent aux caractres 1, 2, 3 et ^.

Les mtacaractres ^ et $

Le mtacaractre ^ identifie un dbut de ligne. Par exemple l'expression rgulire ^a va identifier


les lignes commenant par le caractre a.

Le mtacaractre $ identifie une fin de ligne. Par exemple l'expression rgulire a$ va identifier les
lignes se terminant par le caractre a.

L'expression rgulire ^chaine$ identifie les lignes qui contiennent strictement la chane chaine.

L'expression rgulire ^$ identifie une ligne vide.

Le mtacaractre *

Le mtacaractre * est le caractre de rptition.

L'expression rgulire a* correspond aux lignes comportant 0 ou plusieurs caractre a. Son


utilisation est proscrire, car toutes les lignes, mme celles ne contenant pas le caractre a,
rpondent aux critres de recherche. x* est une source de problmes, il vaut mieux viter de
l'employer.
L'expression rgulire aa* correspond aux lignes comportant 1 ou plusieurs caractres a.

L'expression rgulire .* correspond n'importe quelle chane de caractres.

L'expression rgulire [a-z][a-z]* va chercher les chanes de caractres contenant 1 ou plusieurs


lettres minuscules (de a z).

L'expression rgulire [^ ][^ ]* est quivalent tout sauf un blanc.

Le mtacaractre +

Indique une ou plusieurs occurences du caractre ou de la classe prcedente


a+ correspond une ou plusieurs occurences de la lettre (a)
soit au moins un a ou aa, aaa, aaaa, etc...

Le mtacaractre ?

Indique 0 ou une occurence du caractre ou de la classe prcedente


a? correspond 0 ou une seule occurence de la lettre (a)
soit a ou pas de a

Les mtacaractres \ ( \)

Pour le traitement complexe de fichier, il est utile parfois d'identifier un certain type de chane pour
pouvoir s'en servir dans la suite du traitement comme un sous programme. C'est le principe des sous
chanes, pour mmoriser une sous chane, on utilise la syntaxe \ (expression rgulire)\, cette sous
chane sera identifi par un chiffre compris par 1 et 9 (suivant l'ordre de dfinition).

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

Les classes pr-dfinies

[[:alpha:]] n'importe quelle lettre


[[:digit:]] n'importe quel chiffre
[[:xdigit:]] caractres hxadcimaux
[[:alnum:]] n'importe quelle lettre ou chiffre
[[:space:]] n'importe quel espace blanc
[[:punct:]] n'importe quel signe de ponctuation
[[:lower:]] n'importe quelle lettre en minuscule
[[:upper:]] n'importe quelle lettre capitale
[[:blank:]] espace ou tabulation
[[:graph:]] caractres affichables et imprimables
[[:cntrl:]] caractres d'chappement
[[:print:]] caractres imprimables excepts ceux de contrle

Tableau rcapitulatif

. le point n'importe quel caractre


[...] classe de caractres tous les caractres numrs dans la classe
[^...] classe complmente Tous les caractres sauf ceux numrs
^ circonflexe positionne le dbut de la chaine, la ligne...
$ dollar marque la fin d'une chaine, ligne...
alternative - ou
| barre verticale
reconnat l'un ou l'autre
utilise pour limiter la porte d'un masque ou de
(...) parenthse
l'alternative
* astrisque 0, 1 ou plusieurs occurences
+ le plus 1 ou plusieurs occurence
? interrogation 0 ou 1 occurence

\b Indique une limite de mot dans une chane de caractres


\B Indique ce qui n'est pas une limite de mot dans une chane de caractres

\d Indique la classe de caractres suivants [0-9] ==> ce qui est un chiffre (digit)

\D Indique la classe de caractres suivants [^0-9] ==> ce qui n'est pas un chiffre

\s Indique un espace blanc \t, \r, \n, \f. (space)

\S Indique ce qui n'est pas un espace blanc \t, \r, \n, \f.

\w Indique un mot qui correspond la classe [0-9a-zA-Z_]


L'underscore tant compris dans cette classe.
Les accentus le sont aussi mais cela dpend de la configuration serveur.

\W Indique ce qui n'est pas un mot - correspond la classe [^0-9a-zA-Z]

La commande sed

Prsentation
sed est diteur ligne non interactif, il lit les lignes d'un fichier une une (ou provenant de l'entre
standard) leur applique un certain nombre de commandes d'dition et renvoie les lignes rsultantes
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 mme prcurseur de vi, la syntaxe n'est franchement pas
trs conviviale, mais il permet de raliser 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 dfaut, sed va crire uniquement
les lignes concernes par le traitement (sinon il crit tout mme les lignes non traites). L'option -e
n'est pas ncessaire quand vous avez une seule fonction d'dition.

-i permet de remplacer le fichier traiter directement.

La commande sed est une commande trs riche, ne vous sont prsentes ici que les fonctions les
plus courantes, pour plus de dtails faites un man sed et/ou man ed.

La fonction de substitution s

La fonction de substitution s permet de changer la premire ou toutes les occurences d'une chane
par une autre. La syntaxe est la suivante:

sed "s/toto/TOTO/" fichier va changer la premire occurence de la chane toto par TOTO (la
premire chane toto rencontre dans le texte uniquement)

sed "s/toto/TOTO/3" fichier va changer la troisime occurence de la chane toto par TOTO (la
troisime chane toto rencontre dans le texte uniquement)

sed "s/toto/TOTO/g" fichier va changer toutes les occurences de la chane toto par TOTO (toutes
les chanes toto rencontres sont changes

sed "s/toto/TOTO/p" fichier en cas de remplacement la ligne concerne est affiche sur la sortie
standard (uniquement en cas de substitution)

sed "s/toto/TOTO/w resultat.res" fichier en cas de substitution la ligne en entre est inscrite dans
un fichier rsultat

La fonction de substitution peut videmment tre utilise avec une expression rgulire.

sed -e "s/[Ff]raise/FRAISE/g" fichier substitue toutes les chanes 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
rgulires:

sed "/toto/d" fichier

Cette commande supprime les lignes contenant la chane toto. Si au contraire on ne veut pas effacer
les lignes contenant la chane toto (toutes les autres sont supprimes), on tapera:

sed "/toto/!d" fichier

En fait les lignes du fichier d'entre ne sont pas supprimes, elles le sont au niveau de la sortie
standard.

Les fonctions p, l, et =

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

La commande l (list) affiche la ligne slectionne sur la sortie standard avec en plus les caractres
de contrles en clair avec leur code ASCII (deux chiffres en octal).

La commande = donne le numro de la ligne slectionne sur la sortie standard.

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

sed "/toto/=" fichier

Cette commande va afficher le numro de la ligne contenant la chane toto.

Les fonctions q, r et w

La fonction q (quit) va interrompre l'excution de sed, la ligne en cours de traitement est affiche
sur la sortie standard (uniquement si -n n'a pas t utilise).

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 slectionne dans un fichier.

sed "/^toto/w resultat" fichier

Cette commande va crire dans le fichier resultat toutes les lignes du fichier fichier commenant
par la chane toto.

Les fonctions a et i

La fonction a (append) va placer un texte aprs la ligne slectionne. La syntaxe est la suivante:

a\
le texte
La fonction i (insert) va placer un texte avant la ligne slectionne. 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 \
dernire ligne

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

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

On excute la commande en tapant:

sed -f prog.sed fichier-a-traiter

prog.sed a pour effet d'inscrire avant la premire ligne (1i) le texte "dbut de traitement", et aprs
la dernire ligne ($a) le texte "fin du traitement (retour la ligne) de notre fichier".

sed et les sous chanes

La commande:

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

La sous expression (sous chane) \ ([0-9][0-9]*\) dsigne un ou plusieurs chiffres, chacun sera
entour des caractres aa. La chane to2to deviendra toaa2aato.

Vous aimerez peut-être aussi