TUTORIEL EXPRESSIONS REGULIERES     Précédent   Suivant   Sommaire   Préc.page.lue   Accueil





 1 :  EXPRESSIONS REGULIERES     Précédent   Suivant   Sommaire   Préc.page.lue   Accueil



 1.1 :  EXPRESSIONS REGULIERES STANDARD   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil



 1.1.1 :      EXPRESSIONS REGULIERES DE 'ed'   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil

'ed' supporte une forme limitée d'Expressions Régulières (E.R.) qui permettent, par recherche de correspondance, de localiser des lignes.

Ces E.R. sont dites limitées par rapport à celles de 'egrep' ou 'awk' qui sont des E.R. dites complètes.

Ces expression régulières sont utilisées dans des adresses pour désigner des lignes et dans certaines commandes pour désigner des sous-chaînes à remplacer (exemple commande 's' comme 'substitute').

Une Expression Régulière suit les règles suivantes :

Bien qu'utilisant des caractères utilisés par le SHELL comme méta-caractères pour la désignation de noms de fichier, une Expression Régulière possède un syntaxe différente de celle du SHELL.

EXPRESSION REGULIERE D'UN CARACTERE Les caractères suivants permettront une correspondance avec un seul caractère :

1.1 Un caractère quelconque (autre que ceux spécifiés dans le paragraphe '1.2') est une ER qui correspond à la recherche de ce caractère. Il s'agit de la recherche simple d'un caractère précis.

1.2 Un 'backslash' '\' suivi d'un caractère spécial est une E.R.

qui correspond à la recherche de ce caractère spécial.

Les caractères spéciaux sont :

a : '.' , '*' , '[' et '\'.

Ces caractères sont toujours spéciaux sauf s'ils sont encadrés entre "[]" (voir paragraphe 1.4).

b : '^' qui n'est spécial qu'en début d'E.R. ou immédiatement à gauche dans une chaîne encadrée par des "[]" (voir paragraphe 4.1 ou 4.3).

c : '$' qui n'est spécial qu'en fin d'E.R ou d'un ensemble d'E.R.

(voir paragraphe 4.2)

d : Le caractère utilisé pour spécifier (séparer) une E.R. (voir par exemple dans la commande 'g' l'utilisation du '/')

1.3 Un point '.' est une E.R. d'un seul caractère qui correspond à n'importe quel caractère sauf le saut de ligne.

1.4 Une chaîne non vide de caractères entre "[]" permet de définir une série de caractères intervenant dans la recherche.

Logiquement elle est considérée comme une E.R. d'un seul caractère pouvant avoir n'importe quelle valeur définie entre ces "[]" ou n'importe quelle valeur différente des valeurs définies (voir [...] ou [^...]).

Si le premier caractère qui suit le '[' est un '^' on spécifie non pas les caractères autorisés mais les caractères exclus.

Le '^' ne spécifie cette fonctionnalité que s'il se trouve en première position, immédiatement après le '['.

On pourra spécifier une suite de caractères consécutifs en spécifiant le premier et le dernier de la suite séparés par un '-'. Le caractère '-' est donc un caractère spécial lorsqu'il est entre "[]" mais uniquement s'il ne se trouve pas en première position (derrière le '[' ou '[^') ou en dernière position. Dans un de ces cas il est considéré comme un caractère normal.

Le ']' ne termine pas la chaîne s'il est spécifié tout de suite après le '[' ou les "[^" de début.

[0-9] ::= [0123456789] ::= Tout caractère numérique [^0-9] ::= [^0123456789] ::= Tout caractère non num.

[A-Za-z-] ::= Tout caractère alpha ou le '-'.

[]a-z] ::= Tout caractère alpha ou le ']'.

Les caractères spéciaux du chapitre 1.2 ci-dessus sont considérés comme normaux lorsqu'ils sont entre [].

A partir d'E.R. d'un seul caractère on pourra définir des E.R. de plusieurs caractères en suivant les règles suivantes.

COMBINAISONS D'EXPRESSION REGULIERES D'UN SEUL CARACTERE 2.1 Une combinaison de plusieurs E.R. d'un seul caractère est une E.R. qui correspond à l'ensemble de ce que chaque E.R. désigne.

Exemple : 'a' recherche 'a' et '[bB]' recherche 'b' ou 'B', donc 'a[bB]' recherche 'ab' ou 'aB'.

2.2 Une E.R. d'un seul caractère suivie d'un '*' est une E.R. qui recherche zéro occurence ou plus de ce caractère.

S'il y a plusieurs choix, alors la chaîne de gauche la plus longue est choisie.

ATTENTION : le caractère '*' n'a pas la même signification dans une E.R. que dans la génération de noms de fichiers sous SHELL.

Exemple : E*BCDIC ::= 'BCDIC', 'EBCDIC', 'EEBCDIC', ...

(Recherche de 0 ou plus occurences de 'E' devant 'BCDIC').

En effet c'est la combinaison '.*' qui correspond au '*' du SHELL: zéro ou plus occurences de n'importe quel caractère.

2.3 Une E.R. d'un seul caractère suivie par \{m\}, \{m,\}, ou \{m,n\} est une E.R. qui recherche un ensemble d'occurences de l'E.R. d'un caractère.'m' et 'n' doivent être des entiers positifs ou nuls inférieurs à 256.

\{m\} ::= Recherche exacte de 'm' occurences.

\{m,\} ::= Recherche d'au moins 'm' occurences \{m,n\} ::= Recherche d'un nombre d'occurences compris entre 'm' et 'n' inclus.

Chaque fois qu'un choix existe, l'E.R. cherche la correspondance autant de fois que possible.

2.4 La concaténation d'E.R. d'un seul caractère est une E.R. qui recherche la concaténation des chaînes correspondant à chacun des composants de l'E.R.. Exemple l'E.R. 'a' suivie de l'E.R.

entraîne la recherche de la sous-chaîne "ab".

2.5 Une E.R. encadrée par des caractères '\(' et '\)' est une E.R.

fonctionnant de la même manière qu'une E.R. sans ces caractères.

Mais cette syntaxe permet de séparer une E.R. d'une autre et de faire référence avec \n à la chaîne concernée comme expliqué dans le paragraphe suivant.

2.6 L'expression '\n' (où 'n' est un nombre entier) correspond à la chaîne trouvée par la nième E.R. encadrée par des '\(' et '\)'. Cette expression '\n' sera utilisable lors de commandes de substitution.

Exemples :

'\(.*\):\(.*\)' permet de référencer avec \1 et \2 les sous-chaînes quelconques trouvées devant et derrière le dernier ':' rencontré dans la chaîne.

's/\(.*\):\(.*\)/\2=\1/' ::= Inversion des chaînes trouvées devant et derrière le dernier ':' et remplacement de ce ':' par

            un '='.  ┌─────────────────────────────────────────────────────┐
                     │ abcd:efgh               =>    efgh=abcd             │
                     │ abcd:defg:hijkl:mnop    =>    mnop=abcd:defg:hijkl  │
                     │ ab:cdefgh:ijkl:mnop     =>    mnop=ab:cdefgh:ijkl   │
                     └─────────────────────────────────────────────────────┘

Exemple : l'E.R. ^\(.*\)\1$ recherche une ligne dans laquelle se trouve deux fois la même chaîne de caractères.

TRAITEMENTS DES MOTS

3.1 '\<' oblige l'E.R. à rechercher le début d'un mot (chaîne de caractères chiffres, lettres ou '_') avec, comme séparateur de mot, tout caractère qui n'est pas un chiffre, une lettre ou le '_' Le premier caractère de l'E.R. doit être un chiffre, une lettre ou le '_'. Cette mention '\<' doit figurer devant la sous-chaîne désirée.

3.2 '\>' oblige l'E.R. à rechercher la fin d'un mot (chaîne de caractères chiffres, lettres ou '_') avec, comme séparateur de mot, tout caractère qui n'est pas un chiffre, une lettre ou le '_'.

La mention '\>' doit figurer en fin de la sous-chaîne désirée.

TRAITEMENT DES LIGNES

4.1 Le caractère '^' indique que l'E.R. est à rechercher à partir du début de la ligne.

4.2 Le caractère '$' indique que l'E.R. est à rechercher à partir de la fin de la ligne.

4.3 Une E.R. encadrée entre '^' et '$' entraîne la recherche d'égalité entre la chaîne encadrée et la ligne complète.

Une E.R. nulle (//) équivaut à la dernière E.R. spécifiée.



 1.1.1.1 :        EXPRESSIONS REGULIERES REDUITES/COMPLETES   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil

Les expressions régulières décrites dans le chapitre précédent sont appelées Expressions Régulières Réduites par rapport à celles utilisées par 'egrep' ou 'awk'. Celles ci sont appelées Expressions Régulières Complètes et comportent plusieurs extensions intéressantes (Voir 'egrep').

Les E.R. sont utilisées par un certain nombre de commandes et les E.R. réduites sont valables pour toutes les commandes utilisant des E.R.

Par contre les E.R. complètes sont utilisables uniquement avec certaines commandes.

Fonctionnalités d'Expressions régulières selon les commandes

   ┌────────┬─────────────────────────────┬───────────────────────┐
   │        │     E.R. réduites           │    E.R. complètes     │
   ├────────┼─────┬─────┬─────┬─────┬─────┼─────┬─────┬─────┬─────┤
   │ Cdes   │[...]│  .  │  *  │  ^  │  $  │  ?  │  +  │  |  │ ()  │
   ├────────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
   │ fgrep  │      La commande 'fgrep' n'utilise aucune E.R.      │
   ├────────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
   │ grep   │  x  │  x  │  x  │  x  │  x  │     │     │     │     │
   ├────────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
   │ egrep  │  x  │  x  │  x  │  x  │  x  │  x  │  x  │  x  │  x  │
   ├────────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
   │ ed     │  x  │  x  │  x  │  x  │  x  │     │     │     │     │
   ├────────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
   │ ex/vi  │  x  │  x  │  x  │  x  │  x  │     │     │     │     │
   ├────────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
   │ sed    │  x  │  x  │  x  │  x  │  x  │     │     │     │     │
   ├────────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┼─────┤
   │ awk    │  x  │  x  │  x  │  x  │  x  │  x  │  x  │  x  │  x  │
   └────────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘



 1.1.1.2 :        EXEMPLES D'EXPRESSIONS REGULIERES DE 'ed'   Début   Précédent   Suivant   Sommaire   Préc.page.lue   Accueil

Dans ce chapitre les expressions régulières sont encadrées entre '/' car il s'agit de la syntaxe normale d'appel d'une expression régulière dans 'ed'. Les expressions régulières utilisées dans 'grep' ou d'autres commandes n'ont pas besoin de cet encadrement.

/abc/ ::= Recherche sous-chaîne 'abc'

/[Pp]age/ ::= Recherche sous-chaîne 'Page' ou 'page'

/./ ::= Recherche d'une ligne contenant au moins un caractère.

/\./ ::= Recherche d'une ligne contenant un '.' .

/\// ::= Recherche d'une ligne contenant un '/' .

/1\.5/ ::= Recherche sous-chaîne '1.5'

/a*z/ ::= Recherche de 0 ou plusieurs 'a' ou un 'z' car la '*' n'a pas la même signification qu'en SHELL.

/ab.*z/ ::= Recherche d'une chaîne commençant par 'ab' et finissant par 'z' (Equivalent de ab*z du SHELL).

/a\{4\}/ ::= Recherche sous-chaîne 'aaaa'

/^\(.*\)\1$/ ::= Recherche de lignes contenant au moins deux fois la même sous-chaîne de caractères.

/\<abc/ ::= Recherche d'un mot commençant par 'abc'

/xyz\>/ ::= Recherche d'un mot finissant par 'xyz'

/^$/ ::= Ligne vide

/^abc/ ::= Ligne commençant par 'abc'

/xyz$/ ::= Ligne finissant par 'xyz'

/^abc$/ ::= Ligne ne contenant que 'abc'



 1.1.1.3 :        EXEMPLES DE SUBSTITUTIONS PAR E.R. DANS 'ed'   Début   Précédent   Sommaire   Préc.page.lue   Accueil

s/abc/ABC/ ::= Remplacement de "abc" par "ABC"

s/aBc/%/ ::= Utilisé après le remplacement précédent, remplacement de "aBc" par "ABC"

s/\//#/ ::= Remplacement d'un '/' par un '#'

s:/:#: ::= Remplacement d'un '/' par un '#'

s:/:\%: ::= Remplacement d'un '/' par un '%'

s/a+b/(&)/ ::= Remplacement de "a+b" par "(a+b)"

s/^/ / ::= Insertion en début de ligne de trois espaces.

s/(/{/ ::= Remplacement des '(' par des '{'.

s/)/}/ ::= Remplacement des ')' par des '}'.

Mais si l'on désire remplacer des chaînes encadrées par des '""' en chaînes encadrées par de '{}', alors le problème est soluble bien que plus complexe :

s/"\(.*\)"/{\1}/ ::= On utilise les caractère '"' en début et en fin de chaîne à remplacer. Pour récupérer les caractères compris entre ces caractères on utilise l'expression '.*' (n'importe quel caractère rencontré 0 ou n fois), et l'on encadre cette expression entre '\(' et '\)' ce qui permet de récupérer la chaîne trouvée entre '"' dans la partie chaîne de remplacement sous la forme '\1' que l'on encadre par les '{' et '}' désirés.

Mais il est à noter que la recherche '"\(.*\)"' trouve la plus grande chaîne possible. Ceci fait que s'il existe plusieurs encadrements avec des '"' la chaîne trouvée sera celle comprise entre le premier et le dernier '"' et non pas chaque couple "...".

Si l'on peut se trouver dans ce cas il faudra utiliser la commande suivante :

s/"\([^"]*\)"/{\1}/ ::= Au lieu d'utiliser '.*' (qui signifie n'importe quel caractère) on utilise '[^"]' (qui signifie tout caractère sauf le '"').

Exemple :

        ┌─────────────────────────────────────────────────────────────┐
        │ echo 'abc"def"ghi"jkl"mno' | sed -e 's/"\(.*\)"/{\1}/g'     │
        │ echo 'abc"def"ghi"jkl"mno' | sed -e 's/"\([^"]*\)"/{\1}/g'  │
        └─────────────────────────────────────────────────────────────┘

Affiche :

                      ┌─────────────────────┐
                      │ abc{def"ghi"jkl}mno │
                      │ abc{def}ghi{jkl}mno │
                      └─────────────────────┘



LISTE DES MOTS-CLES

E.R.1.1.1 EXPRESSIONS REGULIERES DE 'ed'
E.R.1.1.1.1 EXPRESSIONS REGULIERES REDUITES/COMPLETES
E.R.1.1.1.2 EXEMPLES D'EXPRESSIONS REGULIERES DE 'ed'
ed1.1.1 EXPRESSIONS REGULIERES DE 'ed'
ed1.1.1.2 EXEMPLES D'EXPRESSIONS REGULIERES DE 'ed'
ed1.1.1.3 EXEMPLES DE SUBSTITUTIONS PAR E.R. DANS 'ed'
ed1.1 EXPRESSIONS REGULIERES STANDARD
ed1.1.1.1 EXPRESSIONS REGULIERES REDUITES/COMPLETES
ed1.1.1.2 EXEMPLES D'EXPRESSIONS REGULIERES DE 'ed'
expression régulière réduite1.1.1 EXPRESSIONS REGULIERES DE 'ed'
EXPRESSIONS REGULIERES1.1.1.3 EXEMPLES DE SUBSTITUTIONS PAR E.R. DANS 'ed'




Valid HTML 4.01 Transitional