Éditeur de flux - Expressions régulières

Ce sont les expressions régulières qui rendent SED puissant et efficace. Un certain nombre de tâches complexes peuvent être résolues avec des expressions régulières. Tout expert en ligne de commande connaît la puissance des expressions régulières.

Comme beaucoup d'autres utilitaires GNU / Linux, SED prend également en charge les expressions régulières, qui sont souvent appelées regex. Ce chapitre décrit les expressions régulières en détail. Le chapitre est divisé en trois sections: les expressions régulières standard, les classes POSIX d'expressions régulières et les caractères Meta.

Expressions régulières standard

Début de ligne (^)

Dans la terminologie des expressions régulières, le symbole caret (^) correspond au début d'une ligne. L'exemple suivant imprime toutes les lignes commençant par le motif «Le».

[jerry]$ sed -n '/^The/ p' books.txt

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

The Two Towers, J. R. R. Tolkien 
The Alchemist, Paulo Coelho 
The Fellowship of the Ring, J. R. R. Tolkien 
The Pilgrimage, Paulo Coelho

Fin de ligne ($)

La fin de la ligne est représentée par le symbole dollar ($). L'exemple suivant imprime les lignes qui se terminent par «Coelho».

[jerry]$ sed -n '/Coelho$/ p' books.txt

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

The Alchemist, Paulo Coelho 
The Pilgrimage, Paulo Coelho

Caractère unique (.)

Le point (.) Correspond à n'importe quel caractère unique sauf le caractère de fin de ligne. L'exemple suivant imprime les trois mots de lettre qui se terminent par le caractère «t».

[jerry]$ echo -e "cat\nbat\nrat\nmat\nbatting\nrats\nmats" | sed -n '/^..t$/p'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

cat 
bat 
rat 
mat

Match de jeu de caractères ([])

Dans la terminologie des expressions régulières, un jeu de caractères est représenté par des crochets ([]). Il est utilisé pour faire correspondre un seul caractère sur plusieurs. L'exemple suivant correspond aux modèles "Call" et "Tall" mais pas "Ball".

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[CT]all/ p'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

Call 
Tall

Ensemble exclusif ([^])

Dans l'ensemble exclusif, le signe d'insertion annule l'ensemble de caractères entre crochets. L'exemple suivant imprime uniquement "Ball".

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[^CT]all/ p'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

Ball

Plage de caractères ([-])

Lorsqu'une plage de caractères est fournie, l'expression régulière correspond à tout caractère compris dans la plage spécifiée entre crochets. L'exemple suivant correspond à "Call" et "Tall" mais pas à "Ball".

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[C-Z]all/ p'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

Call 
Tall

Modifions maintenant la plage en "AP" et observons le résultat.

[jerry]$ echo -e "Call\nTall\nBall" | sed -n '/[A-P]all/ p'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

Call 
Ball

Zéro sur une occurrence (\?)

Dans SED, le point d'interrogation (\?) Correspond à zéro ou à une occurrence du caractère précédent. L'exemple suivant correspond à "Behavior" ainsi qu'à "Behavior". Ici, nous avons créé "u" comme caractère optionnel en utilisant "\?".

[jerry]$ echo -e "Behaviour\nBehavior" | sed -n '/Behaviou\?r/ p'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

Behaviour 
Behavior

Une ou plusieurs occurrences (\ +)

Dans SED, le symbole plus (\ +) correspond à une ou plusieurs occurrences du caractère précédent. L'exemple suivant correspond à une ou plusieurs occurrences de «2».

[jerry]$ echo -e "111\n22\n123\n234\n456\n222"  | sed -n '/2\+/ p'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

22 
123 
234 
222

Zéro occurrence ou plus (*)

Les astérisques (*) correspondent à zéro ou plusieurs occurrences du caractère précédent. L'exemple suivant correspond à «ca», «cat», «catt», etc.

[jerry]$ echo -e "ca\ncat" | sed -n '/cat*/ p'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

ca 
cat

Exactement N occurrences {n}

{n} correspond exactement à "n" occurrences du caractère précédent. L'exemple suivant imprime uniquement les nombres à trois chiffres. Mais avant cela, vous devez créer le fichier suivant qui ne contient que des nombres.

[jerry]$ cat numbers.txt

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

1 
10 
100 
1000 
10000 
100000 
1000000 
10000000 
100000000 
1000000000

Écrivons l'expression SED.

[jerry]$ sed -n '/^[0-9]\{3\}$/ p' numbers.txt

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

100

Notez que la paire d'accolades est échappée par le caractère "\".

Au moins n occurrences {n,}

{n,} correspond à au moins "n" occurrences du caractère précédent. L'exemple suivant imprime tous les nombres supérieurs ou égaux à cinq chiffres.

[jerry]$ sed -n '/^[0-9]\{5,\}$/ p' numbers.txt

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

10000 
100000 
1000000
10000000 
100000000 
1000000000

Occurrence M à N {m, n}

{m, n} correspond à au moins "m" et au plus "n" occurrences du caractère précédent. L'exemple suivant imprime tous les nombres comportant au moins cinq chiffres mais pas plus de huit chiffres.

[jerry]$ sed -n '/^[0-9]\{5,8\}$/ p' numbers.txt

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

10000 
100000 
1000000 
10000000

Tuyau (|)

Dans SED, le caractère de tube se comporte comme une opération OR logique. Il correspond aux éléments de chaque côté du tuyau. L'exemple suivant correspond à "str1" ou "str3".

[jerry]$ echo -e "str1\nstr2\nstr3\nstr4" | sed -n '/str\(1\|3\)/ p'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

str1 
str3

Notez que la paire de parenthèses et de tube (|) est échappée par le caractère "\".

Échapper à des personnages

Il y a certains caractères spéciaux. Par exemple, le retour à la ligne est représenté par "\ n", le retour chariot est représenté par "\ r", et ainsi de suite. Pour utiliser ces caractères dans un contexte ASCII normal, nous devons les échapper en utilisant le caractère barre oblique inverse (\). Ce chapitre illustre l'échappement des caractères spéciaux.

Échapper à "\"

L'exemple suivant correspond au modèle "\".

[jerry]$ echo 'str1\str2' | sed -n '/\\/ p'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

str1\str2

Échapper à "\ n"

L'exemple suivant correspond au caractère de nouvelle ligne.

[jerry]$ echo 'str1\nstr2' | sed -n '/\\n/ p'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

str1\nstr2

Échapper à "\ r"

L'exemple suivant correspond au retour chariot.

[jerry]$ echo 'str1\rstr2' | sed -n '/\\r/ p'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

str1\rstr2

Échapper à "\ dnnn"

Cela correspond à un caractère dont la valeur décimale ASCII est "nnn". L'exemple suivant correspond uniquement au caractère «a».

[jerry]$ echo -e "a\nb\nc" | sed -n '/\d97/ p'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

a

Échapper à "\ onnn"

Cela correspond à un caractère dont la valeur octale ASCII est "nnn". L'exemple suivant correspond uniquement au caractère «b».

[jerry]$ echo -e "a\nb\nc" | sed -n '/\o142/ p'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

b

Cela correspond à un caractère dont la valeur ASCII hexadécimale est "nnn". L'exemple suivant correspond uniquement au caractère «c».

[jerry]$ echo -e "a\nb\nc" | sed -n '/\x63/ p'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

c

Classes POSIX d'expressions régulières

Il existe certains mots réservés qui ont une signification particulière. Ces mots réservés sont appelés classes POSIX d'expression régulière. Cette section décrit les classes POSIX prises en charge par SED.

[: alnum:]

Cela implique des caractères alphabétiques et numériques. L'exemple suivant correspond uniquement à "One" et "123", mais ne correspond pas au caractère de tabulation.

[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alnum:]]/ p'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

One 
123

[:alpha:]

Il n'implique que des caractères alphabétiques. L'exemple suivant correspond uniquement au mot «One».

[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:alpha:]]/ p'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

One

[:Vide:]

Cela implique un caractère vide qui peut être un espace ou une tabulation. L'exemple suivant correspond uniquement au caractère de tabulation.

[jerry]$ echo -e "One\n123\n\t" | sed -n '/[[:space:]]/ p' | cat -vte

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

^I$

Notez que la commande "cat -vte" est utilisée pour afficher les caractères de tabulation (^ I).

[:chiffre:]

Cela implique uniquement des nombres décimaux. L'exemple suivant correspond uniquement au chiffre «123».

[jerry]$ echo -e "abc\n123\n\t" | sed -n '/[[:digit:]]/ p'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

123

[:inférieur:]

Cela implique uniquement des lettres minuscules. L'exemple suivant ne correspond qu'à "un".

[jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:lower:]]/ p'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

one

[:plus haut:]

Cela implique uniquement des lettres majuscules. L'exemple suivant correspond uniquement à «TWO».

[jerry]$ echo -e "one\nTWO\n\t" | sed -n '/[[:upper:]]/ p'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

TWO

[: punct:]

Cela implique des signes de ponctuation qui incluent des caractères non-espace ou alphanumériques

[jerry]$ echo -e "One,Two\nThree\nFour" | sed -n '/[[:punct:]]/ p'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

One,Two

[:espace:]

Cela implique des caractères d'espacement. L'exemple suivant illustre cela.

[jerry]$ echo -e "One\n123\f\t" | sed -n '/[[:space:]]/ p' | cat -vte

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

123^L^I$

Métacaractères

Comme les expressions régulières traditionnelles, SED prend également en charge les métacaractères. Ce sont des expressions régulières de style Perl. Notez que la prise en charge des métacaractères est spécifique à GNU SED et peut ne pas fonctionner avec d'autres variantes de SED. Parlons des métacaractères en détail.

Limite de mot (\ b)

Dans la terminologie des expressions régulières, "\ b" correspond à la limite du mot. Par exemple, "\ bthe \ b" correspond à "le" mais pas à "ceux-ci", "là", "ils", "alors", et ainsi de suite. L'exemple suivant illustre cela.

[jerry]$ echo -e "these\nthe\nthey\nthen" | sed -n '/\bthe\b/ p'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

the

Limite non-mot (\ B)

Dans la terminologie des expressions régulières, "\ B" correspond à une limite non-mot. Par exemple, "le \ B" correspond à "ces" et "ils" mais pas à "le". L'exemple suivant illustre cela.

[jerry]$ echo -e "these\nthe\nthey" | sed -n '/the\B/ p'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

these 
they

Espace (\ s) simple (s)

Dans SED, "\ s" implique un seul caractère d'espacement. L'exemple suivant correspond à «Line \ t1» mais ne correspond pas à «Line1».

[jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\s/ p'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

Line 1

Un seul espace non blanc (\ S)

Dans SED, "\ S" implique un seul caractère d'espacement. L'exemple suivant correspond à "Line2" mais ne correspond pas à "Line \ t1".

[jerry]$ echo -e "Line\t1\nLine2" | sed -n '/Line\S/ p'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

Line2

Caractère de mot unique (\ w)

Dans SED, "\ w" implique un seul mot, c'est-à-dire des caractères alphabétiques, des chiffres et un trait de soulignement (_). L'exemple suivant illustre cela.

[jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\w/ p'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

One 
123 
1_2

Caractère non-mot unique (\ W)

Dans SED, "\ W" implique un caractère non-mot unique qui est exactement opposé à "\ w". L'exemple suivant illustre cela.

[jerry]$ echo -e "One\n123\n1_2\n&;#" | sed -n '/\W/ p'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

&;#

Début de l'espace de motif (\ `)

Dans SED, "\` "implique le début de l'espace de motif. L'exemple suivant correspond uniquement au mot «One».

[jerry]$ echo -e "One\nTwo One" | sed -n '/\`One/ p'

En exécutant le code ci-dessus, vous obtenez le résultat suivant:

One