Bash Pattern Filter

Une expression régulière ou motif ou regex (de l’anglais regular expression) est une chaîne de caractères qui décrit, selon une syntaxe précise, un ensemble de chaînes de caractères possibles. Elles sont issues des théories mathématiques des langages formels.

Les expressions régulières peuvent être testées via https://regex101.com/

Tableau des correspondances

Expressions rationnelles courantes :

Pattern Correspondance
* Toute chaîne de zéro caractère ou plus
? Tout caractère unique
+ 1 ou plusieurs occurrences
{1..9} De 1 à 9
[abc…] N’importe quel caractère de la classe entre
[!abc…] Tout caractère non compris dans la classe etre crochets
[^abc…] Tout caractère non compris dans la classe entre crochets
[[:alpha:]] Tout caractère alphabétique
[[:lower:]] Tout caractère minuscule
[[:upper:]] Tout caractère majuscule
[[:alnum:]] Tout caractère alphabétique ou numérique
[[:punct:]] Tout caractère imprimable, sauf un espace ou un caractère
[[:digit:]] Tout chiffre unique compris entre 0 et 9
[[:space:]] Tout caractère d’espace blanc unique (tabulations, des sauts de ligne, retours chariot,sauts de page, espaces)

Plus complet : https://fr.wikibooks.org/wiki/Programmation_Bash/Regex

Expressions rationnelles courantes

. Point N'importe quel caractère
[...] crochets classe de caractères : tous les caractères énumérés dans la classe, avec possibilité de plages dont les bornes sont séparées par "-". Ex : [0-9a-z] pour tout l'alphanumérique en minuscule, ou [0-Z] pour tous les caractères de la table Unicode entre "0" et "Z", c'est-à-dire l'alphanumérique majuscule plus ":;<=>?@"[3].
[^...] crochets et circonflexe classe complémentée : tous les caractères sauf ceux énumérés.
[...[...]] union Union des deux ensembles
[...&&[...]] intersection Intersection des deux ensembles
^ circonflexe Marque le début de la chaîne ou de la ligne.
$ dollar Marque la fin de la chaîne ou de la ligne.
| barre verticale Alternative - ou reconnaît l'un ou l'autre
(...) parenthèses groupe de capture : utilisé pour limiter la portée d'un masque ou de l'alternative, grouper un motif répété ou capturer une séquence
\n référence Même séquence que celle capturée précédemment par le nème groupe de capture
\g{n} référence Même séquence que celle capturée précédemment par le nème groupe de capture
(?P<nom>pattern) Sous-motif nommé Nomme le résultat d'un groupe de capture par un nom.
\g{nom} référence Même séquence que celle capturée précédemment par le groupe de capture nommé nom.
\k<nom> référence Même séquence que celle capturée précédemment par le groupe de capture nommé nom.

Quantificateurs

Par défaut, les caractères et groupes ne sont pas répétés. Les quantificateurs permettent de spécifier le nombre de répétitions et sont spécifiés immédiatement après le caractère ou groupe concerné.

* astérisque 0, 1 ou plusieurs occurrences
+ plus 1 ou plusieurs occurrences
? interrogation 0 ou 1 occurrence
{...} accolades comptage : détermine un nombre de caractères remplissant les critères qu'il suit. Exemples :
  • a{2} deux occurrences de "a",
  • a{1,10} (sans espace) entre une et dix,
  • a{,10} jusqu'à 10 fois (de 0 à 10),
  • a{3,} au moins 3 fois (de 3 à l'infini).

Par défaut les quantificateurs ne recherchent pas forcément la plus longue séquence de répétition possible. Il est possible de les suffixer avec un caractère pour modifier leur comportement.

? réticent Le quantificateur qui précède recherchera la plus petite séquence possible.
+ possessif Le quantificateur qui précède recherchera la plus grande séquence possible.

Remarques :

  • Les caractères de début et fin de chaîne (^ et $) ne fonctionnent pas dans [] où ils ont un autre rôle.
  • Les opérateurs * et + sont toujours avides, pour qu'ils laissent la priorité il faut leur apposer un ? à leur suite[4].

Classes de caractères

[[:alpha:]] n'importe quelle lettre
[[:digit:]] n'importe quel chiffre
[[:xdigit:]] caractères hexadécimaux
[[: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:]] caractères affichables et imprimables
[[:cntrl:]] caractères d'échappement
[[:print:]] caractères imprimables exceptés ceux de contrôle

Expressions rationnelles Unicode

\\ Antislash
\C Caractère spécial C non interprété : [ ] { } ( ) ? * . : \ & - ^ $
\Q...\E Séquence littérale non interprétée
\0xxx Caractère Unicode (1 à 3 chiffres octaux)
\a Alarme (ASCII 07)
\A Début de chaîne
\b Caractère de début ou fin de mot
\B Caractère qui n'est pas début ou fin de mot
\cX Caractère de contrôle ASCII (X étant une lettre)
\d Chiffre
\D Non chiffre
\e Escape (ASCII 1B)
\f Form-feed (ASCII 0C)
\G Fin de la correspondance précédente
\h Espace blanc horizontal [ \t\xA0\u1680\u180e\u2000-\u200a\u202f\u205f\u3000]
\H Non espace blanc horizontal [^\h]
\n Fin de ligne
\pL, \p{L}, \p{Letter} Lettre (dans tout langage)
\r Retour charriot
\R Retour à la ligne, équivaut à \u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]
\s Caractères espace [ \t\n\x0B\f\r]
\S Non caractères espace [^\s]
\t Tabulation
\uxxxx Caractère Unicode (4 chiffres hexadécimaux)
\v Espace blanc vertical [\n\x0B\f\r\x85\u2028\u2029]
\V Non espace blanc vertical [^\v]
\w Caractère alphanumérique : lettre, chiffre ou underscore
\W Caractère qui n'est pas lettre, chiffre ou underscore
\xxx Caractère Unicode (2 chiffres hexadécimaux)
\x{xx...x} Caractère Unicode (chiffres hexadécimaux)
\X Caractère Unicode du groupe de graphèmes étendu
\z Fin de chaîne

Constructeurs spéciaux : Ces fonctions précèdent l'expression à laquelle elles s'appliquent, et le tout doit être placé entre parenthèses.

  • ?: : groupe non capturant. Ignorer le groupe de capture lors de la numérotation des backreferences. Exemple : ((?:sous-chaine_non_renvoyée|autre).*).
    La présence d'un groupe capturant peut engendrer une allocation mémoire supplémentaire. Si une expression régulière particulièrement complexe provoque une erreur de mémoire, essayez de remplacer les groupes capturant non référencés et inutilisés par des groupes non-capturant en ajoutant ?: juste après la parenthèse ouvrante, et en décalant les numéros des groupes référencés.
  • ?> : groupe non capturant indépendant.
  • ?<= : positive lookbehind, vérifier (sans consommer) que ce qui précède correspond au motif spécifié. Exemple :
    Chercher une lettre u précédée d'une lettre q : (?<=q)u
  • ?<! : negative lookbehind, vérifier (sans consommer) que ce qui précède ne correspond pas au motif spécifié.
  • ?= : positive lookahead, vérifier (sans consommer) que ce qui suit correspond au motif spécifié.
  • ?! : negative lookahead, vérifier (sans consommer) que ce qui suit ne correspond pas au motif spécifié. Exemples :
    Chercher une lettre q non suivie d'une lettre u : q(?!u)
    ((?!sous-chaine_exclue).)
    <(?!body).*> : pour avoir toutes les balises HTML sauf "body".
    début((?!mot_exclu).)*fin[7] : pour rechercher tout ce qui ne contient pas un mot entre deux autres.
    (?!000|666) : pour exclure 000 et 666[8].

Options :

Les options d'interprétation sont en général spécifié à part. Mais certaines API ne permettent pas de les spécifier. Il est possible d'insérer ces options dans l'expression régulière[9].

(?optionsactivées-optionsdésactivées)

Exemples :

  • Chercher un mot composé de voyelles sans tenir compte de la casse :
    (?i)[AEIOUY]+
  • Chercher un mot composé de voyelles en majuscules :
    (?-i)[AEIOUY]+

Les options s'appliquent à toute l'expression quel que soit leur position dans l'expression.

Exemples

Quelques exemples triviaux :

# echo config_{1..3}.txt
config_1.txt
config_2.txt
# echo config_{A..F}{1..5}.txt
config_A1.txt
config_A2.txt
config_A3.txt
config_A4.txt
config_A5.txt
config_B1.txt
config_B2.txt
config_B3.txt
[...]
config_E4.txt
config_E5.txt
config_F1.txt
config_F2.txt
config_F3.txt
config_F4.txt
config_F5.txt
# echo config_{A..F}{8,5}.txt
config_A8.txt
config_A5.txt
config_B8.txt
config_B5.txt
config_C8.txt
config_C5.txt
config_D8.txt
config_D5.txt
config_E8.txt
config_E5.txt
config_F8.txt
config_F5.txt
# echo config_{2023-{A..F},1,5}.txt
config_2023-A.txt
config_2023-B.txt
config_2023-C.txt
config_2023-D.txt
config_2023-E.txt
config_2023-F.txt
config_1.txt
config_5.txt
# mkdir -p tests/Projet-{A,B,C}/{2020..2023}/{Old,Version{1..5}}
# tree tests/
tests/
├── Projet-A
│ ├── 2020
│ │ ├── Old
│ │ ├── Version1
│ │ ├── Version2
│ │ ├── Version3
│ │ ├── Version4
│ │ └── Version5
│ ├── 2021
│ │ ├── Old
│ │ ├── Version1
│ │ ├── Version2
│ │ ├── Version3
│ │ ├── Version4
│ │ └── Version5
│ ├── 2022
│ │ ├── Old
│ │ ├── Version1
│ │ ├── Version2
│ │ ├── Version3
│ │ ├── Version4
│ │ └── Version5
│ └── 2023
│ ├── Old
│ ├── Version1
│ ├── Version2
│ ├── Version3
│ ├── Version4
│ └── Version5
├── Projet-B
│ ├── 2020
│ │ ├── Old
│ │ ├── Version1
│ │ ├── Version2
│ │ ├── Version3
│ │ ├── Version4
│ │ └── Version5
│ ├── 2021
│ │ ├── Old
│ │ ├── Version1
│ │ ├── Version2
│ │ ├── Version3
│ │ ├── Version4
│ │ └── Version5
│ ├── 2022
│ │ ├── Old
│ │ ├── Version1
│ │ ├── Version2
│ │ ├── Version3
│ │ ├── Version4
│ │ └── Version5
│ └── 2023
│ ├── Old
│ ├── Version1
│ ├── Version2
│ ├── Version3
│ ├── Version4
│ └── Version5
└── Projet-C
├── 2020
│ ├── Old
│ ├── Version1
│ ├── Version2
│ ├── Version3
│ ├── Version4
│ └── Version5
├── 2021
│ ├── Old
│ ├── Version1
│ ├── Version2
│ ├── Version3
│ ├── Version4
│ └── Version5
├── 2022
│ ├── Old
│ ├── Version1
│ ├── Version2
│ ├── Version3
│ ├── Version4
│ └── Version5
└── 2023
├── Old
├── Version1
├── Version2
├── Version3
├── Version4
└── Version5

Documentation

https://fr.wikibooks.org/wiki/Programmation_Bash/Regex
https://regex101.com/

> Partager <