É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