Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT →
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révision Les deux révisions suivantes | ||
doc:programmation:shells:bash-vii-globs-etendus-regex [03/07/2014 17:30] 127.0.0.1 modification externe |
doc:programmation:shells:bash-vii-globs-etendus-regex [08/07/2014 19:18] Hypathie [Correspondance de motifs avec les expressions rationnelles] |
||
---|---|---|---|
Ligne 9: | Ligne 9: | ||
* Commentaires sur le forum : [[:url-invalide | Lien vers le forum concernant ce tuto]] ((N'hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !)) | * Commentaires sur le forum : [[:url-invalide | Lien vers le forum concernant ce tuto]] ((N'hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !)) | ||
- | **RAPPEL DU PLAN DE LA SÉRIE : **\\ | ||
- | 1) Intro : [[atelier:chantier:bash-les-differents-caracteres-speciaux|Bash : Introduction]] | ||
- | 2) chap I : [[atelier:chantier:la-page-man-bash-les-caracteres-speciaux|Bash : Détail et caractères]] | + | * [[atelier:chantier:bash-les-differents-caracteres-speciaux|Vision d'ensemble]] |
- | + | * [[atelier:chantier:la-page-man-bash-les-caracteres-speciaux|Bash : Détail et caractères]] | |
- | 3) chap II : [[atelier:chantier:la-page-man-bash-ii-les-operateurs-lexicographiques|Bash : les opérateurs lexicographiques]] | + | * [[atelier:chantier:la-page-man-bash-ii-les-operateurs-lexicographiques|Bash : les opérateurs lexicographiques]] |
- | + | * [[atelier:chantier:page-man-bash-iii-les-operateurs-de-comparaison-numerique|Bash : les opérateurs de comparaison numérique]] | |
- | 4) chap III : [[atelier:chantier:page-man-bash-iii-les-operateurs-de-comparaison-numerique|Bash : les opérateurs de comparaison numérique]] | + | * [[atelier:chantier:page-man-bash-iv-symboles-dans-les-calculs-mathematiques|Bash : les symboles dans les calculs]] |
- | + | * [[atelier:chantier:page-man-bash-v-les-tableaux|Bash : les tableaux]] | |
- | 5) chap IV : [[atelier:chantier:page-man-bash-iv-symboles-dans-les-calculs-mathematiques|Bash : les symboles dans les calculs]] | + | * [[atelier:chantier:man-bash-vi-les-caracteres-de-transformation-de-parametres|Bash : les caractères de transformation de parametres]] |
- | + | ||
- | 6) chap V : [[atelier:chantier:page-man-bash-v-les-tableaux|Bash : les tableaux]] | + | |
- | + | ||
- | 7) chap VI : [[atelier:chantier:man-bash-vi-les-caracteres-de-transformation-de-parametres|Bash : les caractères de transformation de parametres]] | + | |
- | + | ||
- | 8) chap VIII : C'est ici ! | + | |
Ligne 71: | Ligne 63: | ||
shopt -s extglob | shopt -s extglob | ||
</code> | </code> | ||
- | Valider puis dans le même terminal : | + | Valider ensuite toujours dans le même terminal : |
<code user> | <code user> | ||
ls ~/Test/!(*jpg|*bmp) | ls ~/Test/!(*jpg|*bmp) | ||
- | #retour: /home/hypathie/Test/nom.txt | + | </code> |
+ | <code> | ||
+ | /home/hypathie/Test/nom.txt | ||
</code> | </code> | ||
Ligne 81: | Ligne 75: | ||
<code user> | <code user> | ||
cd ~/Test/ | cd ~/Test/ | ||
- | ~/Test$ ls | + | </code> |
- | + | PUIS : | |
- | #retour: image.bmp image.jpg nom.txt | + | <code user> |
- | + | ls | |
- | ~/Test$ echo !(*jpg|*bmp) | + | </code> |
- | + | Retour : | |
- | #retour: nom.txt | + | <code> |
+ | image.bmp image.jpg nom.txt | ||
+ | </code> | ||
+ | PUIS : | ||
+ | <code user> | ||
+ | echo !(*jpg|*bmp) | ||
+ | </code> | ||
+ | <code> | ||
+ | nom.txt | ||
</code> | </code> | ||
Ligne 105: | Ligne 107: | ||
echo "mauvaise correspondance" | echo "mauvaise correspondance" | ||
fi | fi | ||
- | # => mauvaise correspondance | + | |
nom=image.jpg | nom=image.jpg | ||
if [[ "$nom" = *.@(jpg|jpeg) ]] # (ligne 12) | if [[ "$nom" = *.@(jpg|jpeg) ]] # (ligne 12) | ||
Ligne 114: | Ligne 116: | ||
echo "mauvaise correspondance" | echo "mauvaise correspondance" | ||
fi | fi | ||
- | # => bonne correspondance | ||
</code> | </code> | ||
+ | <code> | ||
+ | mauvaise correspondance | ||
+ | bonne correspondance | ||
+ | </code> | ||
+ | |||
<note tip> | <note tip> | ||
Quelques remarques sur la ligne 12.\\ | Quelques remarques sur la ligne 12.\\ | ||
Ligne 131: | Ligne 137: | ||
Les expressions régulières reconnues par Bash sont nommées ERE ("expression régulière étendues).\\ | Les expressions régulières reconnues par Bash sont nommées ERE ("expression régulière étendues).\\ | ||
- | Depuis **Bash 3.0**, on peut pour se faire utiliser l'opérateur =~ avec un modèle regex, "mot-clé". <code>[[ mot-clé]] # modèle regex</code> Cet opérateur =~ permet alors de vérifier la correspondre entre une chaîne (valeur d'une variable à gauche) et le modèle regex à droite.\\ | + | Depuis **Bash 3.0**, on peut pour se faire utiliser l'opérateur =~ avec un modèle regex, "mot-clé". ''[[ mot-clé]] # modèle regex'' Cet opérateur =~ permet alors de vérifier la correspondre entre une chaîne (valeur d'une variable à gauche) et le modèle regex à droite.\\ |
Ou encore de vérifier la correspondance entre une variable constituée d'une chaîne de caractères littérales, et une variable constituée d'une regex.\\ | Ou encore de vérifier la correspondance entre une variable constituée d'une chaîne de caractères littérales, et une variable constituée d'une regex.\\ | ||
Voici quelques liens qui présentent la syntaxe et les caractères utilisables avec Bash sans les commandes grep, sed, awk.\\ | Voici quelques liens qui présentent la syntaxe et les caractères utilisables avec Bash sans les commandes grep, sed, awk.\\ | ||
Ligne 146: | Ligne 152: | ||
**Voici les caractères utilisables :** | **Voici les caractères utilisables :** | ||
^ "signes" regex ERE basique ^ signification (comparez avec le tableau de l'index) ^ | ^ "signes" regex ERE basique ^ signification (comparez avec le tableau de l'index) ^ | ||
- | | <code>.</code> | Correspond à tout caractère unique. Dans expressions POSIX entre crochets, le caractère point correspond à un point littéral | | + | | ''.'' | Correspond à tout caractère unique. Dans expressions POSIX entre crochets, le caractère point correspond à un point littéral | |
- | | <code>[ ]</code> | Correspond à un seul caractère qui est contenue dans les parenthèses. On peut mélanger [abcx-z] correspond à "a", "b", "c", "x", "y" ou "z", de même que [a-cx-z]. Le caractère - est traité comme un caractère littéral si c'est le dernier ou le premier. | | + | | ''[ ]'' | Correspond à un seul caractère qui est contenue dans les parenthèses. On peut mélanger [abcx-z] correspond à "a", "b", "c", "x", "y" ou "z", de même que [a-cx-z]. Le caractère - est traité comme un caractère littéral si c'est le dernier ou le premier. | |
- | | <code>[^ ]</code> | Correspond à un seul caractère qui n'est pas contenu dans les parenthèses. Par exemple, <code>[^ abc]</code> correspond à tout caractère autre que "a", "b" ou "c". | | + | | ''[^ ]'' | Correspond à un seul caractère qui n'est pas contenu dans les parenthèses. Par exemple, ''[^ abc]'' correspond à tout caractère autre que "a", "b" ou "c". | |
- | | <code>^ </code> | Correspond à la position de départ dans la chaîne. | | + | | ''^ '' | Correspond à la position de départ dans la chaîne. | |
- | | <code>$</code> | Correspond à la position de fin de la chaîne ou la position juste avant un saut de ligne de chaîne interminable. | | + | | ''$'' | Correspond à la position de fin de la chaîne ou la position juste avant un saut de ligne de chaîne interminable. | |
- | | <code>( )</code> | Définit une sous-expression marquée. La chaîne correspondante entre parenthèses peut être rappelé plus tard (voir l'entrée suivante, \ n). Une sous-expression marquée est aussi appelé un groupe de blocs ou de capturer. Mode BRE nécessite \ (\). | | + | | ''( )'' | Définit une sous-expression marquée. La chaîne correspondante entre parenthèses peut être rappelé plus tard (voir l'entrée suivante, \ n). Une sous-expression marquée est aussi appelé un groupe de blocs ou de capturer. Mode BRE nécessite \ (\). | |
- | | <code>\n</code> | Correspond au nombre n de sous-chaîne, où n est un chiffre de 1 à 9.\\ Écriture équivalente à {n} | | + | | ''\n'' | Correspond au nombre n de sous-chaîne, où n est un chiffre de 1 à 9.\\ Écriture équivalente à {n} | |
- | | <code>*</code> | Correspond à zéro ou plusieurs fois l'élément précédent.\\ Par exemple, <code>ab * c</code> correspond à "ac", "abc", "abbbc», etc. Ou encore, <code>[xyz] *</code> correspond à " ", "x", "y", "z", "zx", "zyx", "xyzzy ", et ainsi de suite. <code>(ab) *</code> correspond à "", "b", "abab", "ababab", et ainsi de suite. | | + | | ''*'' | Correspond à zéro ou plusieurs fois l'élément précédent.\\ Par exemple, ''ab * c'' correspond à "ac", "abc", "abbbc», etc. Ou encore, ''[xyz] *'' correspond à " ", "x", "y", "z", "zx", "zyx", "xyzzy ", et ainsi de suite. ''(ab) *'' correspond à "", "b", "abab", "ababab", et ainsi de suite. | |
- | | <code>{m,n}</code> | Correspond au moins à m fois mais pas plus de n fois l'élément précédent.\\ Par exemple, <code>a{3,5}</code> correspond uniquement "aaa", ou "aaaa", ou "aaaaa". | | + | | ''{m,n}'' | Correspond au moins à m fois mais pas plus de n fois l'élément précédent.\\ Par exemple, ''a{3,5}'' correspond uniquement "aaa", ou "aaaa", ou "aaaaa". | |
- | | <code>{ }</code> | "exactement trois fois" par exemple <code>a{3}</code> correspond aaa seulement. (équivalent de aaa d'expression) | | + | | ''{ }'' | "exactement trois fois" par exemple ''a{3}'' correspond aaa seulement. (équivalent de aaa d'expression) | |
- | | <code>{n,}</code> | "jusqu'à trois fois". «trois fois ou plus». Par exemple, <code>a{3,}</code> correspond aaa ou aaaa, etc. (équivalent de <code>a*</code>) | | + | | ''{n,}'' | "jusqu'à trois fois". «trois fois ou plus». Par exemple, ''{3,}'' correspond aaa ou aaaa, etc. (équivalent de ''a*'') | |
- | | <code>{,n}</code> | <code>a{,3}</code> "jusqu'à trois fois". Correspond à la chaîne vide ou a ou aa ou aaa (équivalent de <code>| a | aa | aaa</code>.| | + | | ''{,n}'' | ''a{,3}'' "jusqu'à trois fois". Correspond à la chaîne vide ou a ou aa ou aaa (équivalent de ''| a | aa | aaa''.| |
- | |POSIX extended | Bash avec correctif, sinon il faut \ devant parenthèse et crochet. <code>\( \)</code> et <code>\{ \}</code> FIXME | | + | |POSIX extended | Bash avec correctif, sinon il faut \ devant parenthèse et crochet. ''\( \)'' et ''\{ \}'' | |
|autres caractères | signification | | |autres caractères | signification | | ||
- | | <code>?</code> | Correspond zéro ou une fois à l'élément précédent. Par exemple, ab? c correspond seulement "ac" ou "abc". | | + | | ''?'' | Correspond zéro ou une fois à l'élément précédent. Par exemple, ab? c correspond seulement "ac" ou "abc". | |
- | | <code>+</code> | Correspond une ou plusieurs fois à l'élément précédent. Par exemple, ab + c correspond à "abc", "abbc", "abbbc", et ainsi de suite, mais pas "ac". | | + | | ''+'' | Correspond une ou plusieurs fois à l'élément précédent. Par exemple, ab + c correspond à "abc", "abbc", "abbbc", et ainsi de suite, mais pas "ac". | |
- | | <code>|</code> | Correspond à l'expression d'avant OU l'expression d'après l'opérateur. Par exemple, <code>abc|def</code> correspond à "abc" ou "def". | | + | | ''|'' | Correspond à l'expression d'avant OU l'expression d'après l'opérateur. Par exemple, ''abc|def'' correspond à "abc" ou "def". | |
| Et tous les caractères de class posix | voir leur signification ici [[http://wiki.debian-facile.org/doc:programmation:shell:regexp#les-ensembles-de-caracteres-possibles]] | | | Et tous les caractères de class posix | voir leur signification ici [[http://wiki.debian-facile.org/doc:programmation:shell:regexp#les-ensembles-de-caracteres-possibles]] | | ||
- | | <code>[:alnum:] [:alpha:] [:blank:] [:cntrl:] [:digit:] [:graph:] [:lower:] [:print:] [:punct:] [:space:] [:upper:] [:xdigit:]</code> || | + | | ''[:alnum:] [:alpha:] [:blank:] [:cntrl:] [:digit:] [:graph:] [:lower:] [:print:] [:punct:] [:space:] [:upper:] [:xdigit:]'' || |
Ligne 181: | Ligne 187: | ||
done | done | ||
</code> | </code> | ||
- | |||
- | Retour | ||
<code> | <code> | ||
1234567 ne correspond pas à 9 nombres | 1234567 ne correspond pas à 9 nombres | ||
Ligne 204: | Ligne 208: | ||
echo "pas de match" | echo "pas de match" | ||
fi | fi | ||
- | |||
- | # retour : match | ||
</code> | </code> | ||
+ | <code> | ||
+ | match | ||
+ | </code> | ||
===Compliquons un peu en utilisant plusieurs autres caractères du tableau ci-dessus :=== | ===Compliquons un peu en utilisant plusieurs autres caractères du tableau ci-dessus :=== | ||
Ligne 224: | Ligne 228: | ||
echo "mauvaise regex" | echo "mauvaise regex" | ||
fi | fi | ||
- | |||
- | # retour : Le nom de l'image correspond à l'expression rationnelle. | ||
</code> | </code> | ||
+ | <code> | ||
+ | Le nom de l'image correspond à l'expression rationnelle. | ||
+ | </code> | ||
===explication=== | ===explication=== | ||
Ligne 263: | Ligne 267: | ||
</note> | </note> | ||
- | ====4) un petit script pour s'exercer au ER==== | + | ====4) un script pour s'exercer au ER==== |
- | **Voici un petit script "exp.reg1" qui regroupe les notions étudiées jusqu'à présent.**\\ | + | Voici un script "exp.reg1" ; il a pour but de s'exercer aux expressions régulières.\\ |
- | Il a pour but de s'exercer aux expressions régulières.\\ | + | |
<code bash> | <code bash> | ||
#!/bin/bash | #!/bin/bash | ||
Ligne 309: | Ligne 313: | ||
# ligne 33 (if) : $? (code de retour) -eq (égal à) zéro (pas d'erreur de sortie, donc bonne correspondance) | # ligne 33 (if) : $? (code de retour) -eq (égal à) zéro (pas d'erreur de sortie, donc bonne correspondance) | ||
</code> | </code> | ||
+ | Lancez-le comme ci-dessous, explications détaillées dans le retour :\\ | ||
- | **Lancez-le ainsi (explications détaillées dans le retour) :**\\ | ||
- | (en considérant que le dossier parent de ce script figure dans $PATH, après modification du fichier ~/.bashrc\\ | ||
- | voir : [[atelier:chantier:debuter-avec-les-scripts-shell-bash#executer-son-script-depuis-n-importe-ou|3) Exécuter son script depuis n'importe où !]]) | ||
<code user> | <code user> | ||
- | exp.reg1 "^[a-b]" "abc" "ABC" # ER comme premier argument et le ou les chaînes à vérifier en second, troisième, etc. | + | ./exp.reg1 "^[a-b]" "abc" "ABC" |
</code> | </code> | ||
+ | >La ER comme premier argument de "exp.reg1", puis le ou les chaînes à vérifier en second, troisième, etc. argument de "exp.reg1". | ||
+ | |||
+ | Et voilà :-) | ||
+ | **Un grand merci à captnfab pour conseils avisés et toutes ses corrections.** | ||
=====INDEX ===== | =====INDEX ===== | ||
====1) rappel des principaux caractères des expressions rationnelles ==== | ====1) rappel des principaux caractères des expressions rationnelles ==== |