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 | ||
utilisateurs:hypathie:tutos:erb-et-ere-par-le-contexte-des-commandes [14/08/2014 09:17] Hypathie [Introduction] |
utilisateurs:hypathie:tutos:erb-et-ere-par-le-contexte-des-commandes [15/08/2014 17:24] Hypathie [Introduction] |
||
---|---|---|---|
Ligne 10: | Ligne 10: | ||
=====Introduction ===== | =====Introduction ===== | ||
- | Il faut savoir en effet que : | + | Il faut savoir en effet : |
* qu'il y a plusieurs types d'expressions rationnelles, celles reposant sur [[http://fr.wikipedia.org/wiki/Biblioth%C3%A8que_logicielle|la bibliothèque]] REGEX, celles reposant sur la bibliothèque [[http://fr.wikipedia.org/wiki/PCRE|PCRE]]. | * qu'il y a plusieurs types d'expressions rationnelles, celles reposant sur [[http://fr.wikipedia.org/wiki/Biblioth%C3%A8que_logicielle|la bibliothèque]] REGEX, celles reposant sur la bibliothèque [[http://fr.wikipedia.org/wiki/PCRE|PCRE]]. | ||
Ligne 16: | Ligne 16: | ||
* qu'il y a différents programmes qui utilisent soit l'une, soit l'autre bibliothèque par exemple grep, expr, awk, Perl, Tcl, Python... Je ne parlerai que de ceux pouvant utiliser la bibliothèque REGEX. | * qu'il y a différents programmes qui utilisent soit l'une, soit l'autre bibliothèque par exemple grep, expr, awk, Perl, Tcl, Python... Je ne parlerai que de ceux pouvant utiliser la bibliothèque REGEX. | ||
- | * Certains des métacaractères reconnus par les shells UNIX (bash, ksh, csh, sh, etc.), sont homonymes avec certains caractères des //ER//, et qui plus est, ils servent le même objectif de fournir des motifs de recherche. Mais ils ne font pas partie de ce qu'on appelle les expressions rationnelles et ne doivent pas être confondus avec elles.\\ J'insisterai sur ce point pour éviter la confusion. | + | * que certains des métacaractères reconnus par les shells UNIX (bash, ksh, csh, sh, etc.), sont homonymes avec certains caractères des //ER//, et qui plus est, ils servent le même objectif de fournir des motifs de recherche. Mais ils ne font pas partie de ce qu'on appelle les expressions rationnelles et ne doivent pas être confondus avec elles.\\ J'insisterai sur ce point pour éviter la confusion. |
- | * La syntaxe d'utilisation des //ER// n'est pas la même d'un programme à l'autre. C'est ce qui motive la rédaction de cette page. Il faut forcément maîtriser la manière d'utiliser les //ER// pour chacun des programmes pour pouvoir les utiliser. Mettre ces différences en avant démystifiera la difficulté attribuée à l'usage des expressions rationnelles. | + | * que la syntaxe d'utilisation des //ER// n'est pas la même d'un programme à l'autre. C'est ce qui motive la rédaction de cette page. Il faut forcément maîtriser la manière d'utiliser les //ER// pour chacun des programmes pour pouvoir les utiliser. Mettre ces différences en avant démystifiera la difficulté attribuée à l'usage des expressions rationnelles. |
- | * Enfin, les différents programmes susceptibles d'utiliser toutes les //ER// de la bibliothèque REGEX, vi, expr, grep, egrep, find, locate, sed, awk, etc., bien que pouvant tous utiliser la norme POSIX, __transforment le contexte d'utilisation de l'//ER// et par conséquent, l'utilisation d'une même //ER// n'a plus le même effet d'un programme à l'autre__.\\ C'est là un point crucial, rarement mis en avant et qu'il est pourtant nécessaire de soulever, pour des raisons pédagogiques, mais aussi pour des raisons philosophiques que je ne développerai pas.\\ Le fondement en est simplement la conviction que le dédain envers la diversité, tandis qu'un méta-langage est par définition l'unité cachée derrière tout genre de multiple, est une tentative qui s'ignore de ramener le méta-langage lui-même à une simple symbolisation du langage, et par conséquent, une tentative intéressée d'instrumentaliser la raison. | + | * Enfin, les différents programmes susceptibles d'utiliser toutes les //ER// de la bibliothèque REGEX, vi, expr, grep, egrep, find, locate, sed, awk, __transforment le contexte d'utilisation de l'//ER// et par conséquent, l'utilisation d'une même //ER// n'a plus le même effet d'un programme à l'autre__.\\ |
+ | Ce dernier point est rarement mis en avant, il est pourtant crucial de le soulever, pour des raisons autant pédagogiques, que philosophiques.\\ Le fondement en est simplement la certitude que //le dédain envers la diversité//, tandis que l'entendement est la puissance d'éprouver l'unité cachée sous tout genre de multiple, est une tentative qui s'ignore d'instrumentaliser la raison. | ||
- | **Cette présentation des expressions rationnelles montera comment les utiliser au moyen des commandes de recherches et d'édition de fichiers, et cela, en appréhendant seulement les expressions rationnelles POSIX de la bibliothèque REGEX.\\ | + | **En bref, il s'agira de donner accès à l'utilisation, en ligne de commandes GNU/linux, des expressions rationnelles POSIX de la bibliothèque REGEX.** |
- | + | ||
- | En bref, il s'agira de présenter les types de //ER// qui s'utilisent en ligne de commandes ou dans des scripts shell GNU/linux.** | + | |
====Les types de ER ==== | ====Les types de ER ==== | ||
Ligne 36: | Ligne 35: | ||
Les raccourcis (par exemples, retour à la ligne ''\n'', tabulation ''\t'') étant particuliers aux programmes, seront listés en complément. | Les raccourcis (par exemples, retour à la ligne ''\n'', tabulation ''\t'') étant particuliers aux programmes, seront listés en complément. | ||
+ | |||
+ | **Le détail des expressions régulières est présenté ainsi :** | ||
+ | - **[[utilisateurs:hypathie:tutos:erb-et-ere-par-le-contexte-des-commandes?&#caracteres-communs-aux-erb-et-ere|les caractères communs aux ERb et ERe]].** | ||
+ | - **les caractères spécifiques [[utilisateurs:hypathie:tutos:erb-et-ere-par-le-contexte-des-commandes?&#caracteres-specifiques-aux-erb|aux ERb]] et [[utilisateurs:hypathie:tutos:erb-et-ere-par-le-contexte-des-commandes?&#caracteres-specifiques-aux-ere|aux ERe]].** | ||
+ | - **[[utilisateurs:hypathie:tutos:erb-et-ere-par-le-contexte-des-commandes?&#les-classes|les classes]]** | ||
==== Panorama exhaustif des programmes GNU/Linux concernés par les expressions rationnelles=== | ==== Panorama exhaustif des programmes GNU/Linux concernés par les expressions rationnelles=== | ||
Ligne 64: | Ligne 68: | ||
|**''[ - ]''**\\ [a-z]\\ [A-Z]\\ [A-Z]\\ [0-9] |groupe de caractères |''head t[a-z]to''\\ **affiche**\\ titi\\ tito\\ toto\\ ...\\ **mais pas**\\ tOto\\ t5to\\ | | |**''[ - ]''**\\ [a-z]\\ [A-Z]\\ [A-Z]\\ [0-9] |groupe de caractères |''head t[a-z]to''\\ **affiche**\\ titi\\ tito\\ toto\\ ...\\ **mais pas**\\ tOto\\ t5to\\ | | ||
- | ===Métacaractère ou caractère d'expression rationnelle ?=== | ||
- | * L'étoile : | + | ====Métacaractère ou caractère d'expression rationnelle ?==== |
- | Imaginons qu'on cherche __tous les fichiers__ contenant le caractère "e".\\ | + | Les commandes de recherche et d'édition de fichiers peuvent utiliser métacaractères et les caractères servant aux expressions rationnelles. |
- | <code user>grep -lR "e" Toto*</code> | + | ===Préparation=== |
+ | |||
+ | * Exécuter cette ligne de commande : | ||
+ | <code user> | ||
+ | mkdir ERetCMD/ && cd ERetCMD/ && mkdir Dossier/ &&\ | ||
+ | cd Dossier/ && touch milou && touch tata &&\ | ||
+ | printf "Toto Titi toto titi tito\ndans\n" > titi &&\ | ||
+ | printf "Toto Titi\ndent\n" > titi2 &&\ | ||
+ | printf "toto aime le chocolat\n" > toto &&\ | ||
+ | printf "Toto titi toto tito\n" > Toto.txt &&\ | ||
+ | printf "un copain malin\nmodifiant cette page\n" > tintin &&\ | ||
+ | printf "documentation\n" > titi1 && printf "." > titi1.txt &&\ | ||
+ | printf "Il manque une option a tito\n" > tito &&\ | ||
+ | printf "il a tout mangé.\n" > Toto1.txt | ||
+ | ls | ||
+ | </code> | ||
+ | |||
+ | <code> | ||
+ | milou tintin titi1 titi2 toto Toto.txt | ||
+ | tata titi titi1.txt tito Toto1.txt | ||
+ | </code> | ||
+ | |||
+ | <note> | ||
+ | Il est nécessaire d'avoir dossier, sous-dossier, et des fichiers ayant ou non du contenu pour s'exercer.\\ | ||
+ | Mais pas d'inquiétude, tout ce qui a été créé ou qui le sera, peut être supprimer en une ligne: | ||
+ | <code user> | ||
+ | cd ~ && rm -vfR ERetCMD/ | ||
+ | </code> | ||
+ | Le dossier et fichiers créés dans le dossier "ERetCMD" au cours de cette partie serviront aux exemples d'utilisation des expressions rationnelles avec chacun des programmes GNU/Linux. Mieux vaut ne pas les supprimer dès la fin de cette partie. | ||
+ | </note> | ||
+ | |||
+ | ===grep=== | ||
+ | |||
+ | * __L'étoile__ : | ||
+ | Imaginons qu'on cherche __tous les fichiers commençant par "t"__ contenant le caractère "e".\\ | ||
+ | |||
+ | <code user>grep -lR "e" t*</code> | ||
+ | <code> | ||
+ | tintin | ||
+ | titi1 | ||
+ | titi2 | ||
+ | tito | ||
+ | toto | ||
+ | </code> | ||
> option -l : Ne pas afficher les résultats normaux. À la place, indiquer le nom des fichiers pour lesquels des résultats auraient été affichés. | > option -l : Ne pas afficher les résultats normaux. À la place, indiquer le nom des fichiers pour lesquels des résultats auraient été affichés. | ||
> option -R : Lire récursivement tous les fichiers à l'intérieur de chaque répertoire. | > option -R : Lire récursivement tous les fichiers à l'intérieur de chaque répertoire. | ||
- | >Ce qui concerne la recherche dans le contenu du fichier est indiqué par le motif entre guillemets ("e"). C'est là qu'il faudra avec grep placer l'expression rationnelle. Le motif "e" en est d'ailleurs une. | + | >Le motif entre guillemets ("e") concerne la recherche dans le contenu du fichier. C'est là qu'il faut placer l'expression rationnelle. Le motif "e" en est d'ailleurs une. |
- | >Le caractère "*" est le métacaractère qui signifie "__nom de fichier__ commençant par "Toto" avec n'importe quel autre caractère après ou pas. | + | >Le caractère "*" est le métacaractère qui signifie "__nom de fichier__ commençant par "Toto" avec n'importe quel autre caractère après ou rien après. |
- | * Le caractère ? | + | * __Le caractère ?__ |
<code>grep -E "[ae]n.?" titi?</code> | <code>grep -E "[ae]n.?" titi?</code> | ||
+ | |||
+ | >Il faut grep -E car le **''?''** fait partie des expressions rationnelles étendues. | ||
+ | >On peut aussi faire **''grep "[ae]n.\?" titi?''** car grep utilise par défaut les expressions rationnelles basiques qui nécessitent **''\''** devant certains caractères. | ||
+ | |||
<code> | <code> | ||
- | titi.:dans | + | titi1:documentation |
- | titi1:en | + | |
titi2:dent | titi2:dent | ||
</code> | </code> | ||
- | >Cela signifie qu'on recherche dans les fichiers commençant par **''titi''** suivi d'un seul caractère exactement, et dans lequel on cherche les mots comportant la diphtongue ɑ̃ qui s'écrit "an" ou "en" ; l'expression rationnelle décrit ainsi : chaîne composée de "a" ou "e", suivi de "n", suivi d'un seul caractère ou non. | + | >On recherche dans les fichiers commençant par **''titi''** et suivi d'un seul caractère exactement (**''?''**), les mots comportant "an" ou "en".((Ici le caractère précédent est le "point", c'est-à-dire un caractère quelconque.)) |
- | > Le **''?''** est un caractère d'expressions rationnelles et signifie "le caractère précédent (ou le groupement précédent) zéro ou une fois. Ici le caractère précédent est le "point", c'est-à-dire un caractère quelconque. | + | >L'expression rationnelle décrit : une chaîne composée de "a" ou "e", suivi de "n", suivi d'un seul caractère ou non. |
- | >Il faut grep -E car le **''?''** fait partie des expressions rationnelles étendues. | + | |
- | >On peut aussi faire **''grep "[ae]n.\?" titi?''** car grep utilise par défaut les expressions rationnelles basiques qui nécessitent **''\''** devant certains caractères. | + | |
- | * Les crochets ont la même signification en tant que métacaractère et en tant que //ER// | + | * __Les crochets__ ont la même signification en tant que métacaractère et en tant que //ER// |
>Pour trouver dans les fichiers commençant par "T" ou "t" suivi de "i" ou "o" suivi d'un "t" suivi de "i" ou "o" suivi d'un caractère quelconque et un seul ; | >Pour trouver dans les fichiers commençant par "T" ou "t" suivi de "i" ou "o" suivi d'un "t" suivi de "i" ou "o" suivi d'un caractère quelconque et un seul ; | ||
Ligne 96: | Ligne 143: | ||
<code user>grep "[Tt][io]t[io]" [Tt][io]t[io]?</code> | <code user>grep "[Tt][io]t[io]" [Tt][io]t[io]?</code> | ||
<code> | <code> | ||
- | titi.:Toto Titi toto titi tito | + | grep "[Tt][io]t[io]" [Tt][io]t[io]? |
- | titi1:Toto titi toto tito | + | |
- | titi2:Toto Titi | + | |
- | toto.:Toto titi toto tito | + | |
</code> | </code> | ||
- | * Le point n'est pas un métacaractère : | + | * __Le point n'est pas un métacaractère__ : |
> mais c'est un caractère des expressions rationnelles. | > mais c'est un caractère des expressions rationnelles. | ||
- | >Ainsi la ligne signifie : rechercher un point littéral dans les fichiers commençant soit par "T" soit par "t", suivi de plusieurs caractères, et finissant par "txt" | + | >Ainsi la ligne signifie : rechercher un point littéral((le point étant un caractère des ER, il faut l'antislash pour qu'il soit lu comme un point littéral)) dans les fichiers commençant soit par "T" soit par "t", suivi de plusieurs caractères, et finissant par "txt" |
<code>grep "\." [Tt]*.txt</code> | <code>grep "\." [Tt]*.txt</code> | ||
<code> | <code> | ||
titi1.txt:. | titi1.txt:. | ||
- | Toto1.txt:. | + | Toto1.txt:il a tout mangé. |
</code> | </code> | ||
- | ====Métacaractères du shell et commandes utilisant les expressions rationnelles==== | + | === find=== |
+ | //Depuis le répertoire personnel ou le répertoire "~ERetCMD" ou même le répertoire "~/ERetCMD/Dossier/"// | ||
- | Parmi les commandes GNU/Linux utilisant les expressions rationnelles, d'autres commandes que **grep** ou **grep -E** utilisent aussi les métacaractères.\\ | + | * __Étoile__ : |
- | Il s'agit de **find** et **locate**. | ||
- | |||
- | === find=== | ||
<code user>find ~/ERetCMD/Dossier/ -name "toto*"</code> | <code user>find ~/ERetCMD/Dossier/ -name "toto*"</code> | ||
<code> | <code> | ||
/home/hypathie/ERetCMD/Dossier/toto | /home/hypathie/ERetCMD/Dossier/toto | ||
- | /home/hypathie/ERetCMD/Dossier/toto. | ||
</code> | </code> | ||
+ | |||
+ | * __Le point d'interrogation :__ | ||
<code user>find ~/ERetCMD/Dossier/ -name "titi?"</code> | <code user>find ~/ERetCMD/Dossier/ -name "titi?"</code> | ||
<code> | <code> | ||
/home/hypathie/ERetCMD/Dossier/titi1 | /home/hypathie/ERetCMD/Dossier/titi1 | ||
- | /home/hypathie/ERetCMD/Dossier/titi. | + | /home/hypathie/ERetCMD/Dossier/titi2 |
</code> | </code> | ||
+ | |||
+ | * __Crochets :__ | ||
<code user>find ~/ERetCMD/Dossier/ -name "[Tt][io]t[io]?"</code> | <code user>find ~/ERetCMD/Dossier/ -name "[Tt][io]t[io]?"</code> | ||
<code> | <code> | ||
/home/hypathie/ERetCMD/Dossier/titi1 | /home/hypathie/ERetCMD/Dossier/titi1 | ||
- | /home/hypathie/ERetCMD/Dossier/toto. | + | /home/hypathie/ERetCMD/Dossier/titi2 |
- | /home/hypathie/ERetCMD/Dossier/titi. | + | |
</code> | </code> | ||
===locate === | ===locate === | ||
+ | |||
+ | * __Préparation :__ | ||
+ | |||
+ | Se déplacer dans le répertoire "~/ERetCMD/" ; y créer les fichiers suivants en faisant : | ||
+ | <code user> | ||
+ | cd ~/ERetCMD/ && touch liste liste1 liste1-nom liste2\ | ||
+ | liste2-nom liste3-erb-ere liste4-spec\ | ||
+ | liste4-vim liste-class server-0.xkb smolski-exo-sed.txt\ | ||
+ | sort1.txt sort2.txt sort3.txt\ | ||
+ | image\ linux\ -\ 01.jpg image\ linux\ -\ 02.jpg\ | ||
+ | image\ linux\ -\ 03.jpg img-perso-1.jpg img-perso-2.jpg | ||
+ | ls | ||
+ | </code> | ||
+ | |||
+ | <code> | ||
+ | Dossier img-perso-2.jpg liste2-nom server-0.xkb | ||
+ | image linux - 01.jpg liste liste3-erb-ere smolski-exo-sed.txt | ||
+ | image linux - 02.jpg liste1 liste4-spec sort1.txt | ||
+ | image linux - 03.jpg liste1-nom liste4-vim sort2.txt | ||
+ | img-perso-1.jpg liste2 liste-class sort3.txt | ||
+ | </code> | ||
+ | |||
<note tip> | <note tip> | ||
Pour utiliser locate, qui fonctionne à partir de la base de donnée, faire un petit : | Pour utiliser locate, qui fonctionne à partir de la base de donnée, faire un petit : | ||
- | <code root> # updatedb</code> | + | <code root>updatedb</code> |
pour effectuer les mises à jour, avant de lancer la recherche. | pour effectuer les mises à jour, avant de lancer la recherche. | ||
</note> | </note> | ||
- | |||
- | *Soit le répertoire "~/ERetCMD/" | ||
- | <code>ls ~/ERetCMD/</code> | ||
- | <code> | ||
- | Dossier liste1-nom~ server-0.xkb sort2.txt | ||
- | essai.grep2~ liste2-nom smolski-exo-sed.txt sort3.txt | ||
- | liste1-nom liste3-erb-ere sort1.txt xxx-sort.txt | ||
- | </code> | ||
* Rechercher les fichiers dont le nom est "un ou plusieurs caractères suivi de ".txt" : | * Rechercher les fichiers dont le nom est "un ou plusieurs caractères suivi de ".txt" : | ||
Ligne 163: | Ligne 221: | ||
/home/hypathie/ERetCMD/sort2.txt | /home/hypathie/ERetCMD/sort2.txt | ||
/home/hypathie/ERetCMD/sort3.txt | /home/hypathie/ERetCMD/sort3.txt | ||
- | /home/hypathie/ERetCMD/xxx-sort.txt | + | |
+ | </code> | ||
+ | |||
+ | ===sed=== | ||
+ | |||
+ | * __sed utilise aussi les deux :__ | ||
+ | |||
+ | Vérifier qu'on est bien au niveau du "~/ERetCMD/Dossier/" | ||
+ | |||
+ | <code user>sed -r '/(a|e).*/s/a/A/' ti*</code> | ||
+ | |||
+ | > L'expression rationnelle est constituée de l'alternative ''(a|e)'' (la sous-chaîne "a" ou "e"), suivi d'un caractère quelconque zéro ou plusieurs fois. | ||
+ | >Cela sera approfondit dans la partie [[utilisateurs:hypathie:tutos:erb-et-ere-par-le-contexte-des-commandes#caracteres-specifiques-aux-erb-ou-caracteres-specifiques-aux-ere|Caractères spécifiques aux ERb ou caractères spécifiques aux ERe]] | ||
+ | |||
+ | <code> | ||
+ | un copAin malin | ||
+ | modifiAnt cette page | ||
+ | Toto Titi toto titi tito | ||
+ | dAns | ||
+ | documentAtion | ||
+ | . | ||
+ | Toto Titi | ||
+ | dent | ||
+ | Il mAnque une option a tito | ||
+ | </code> | ||
+ | |||
+ | ===awk === | ||
+ | |||
+ | * __De même encore pour awk :__ | ||
+ | |||
+ | Dans le dossier "~/ERetCMD/Dossier" créer les fichiers "smolski-awk.txt" et "smolski-sed.txt": | ||
+ | <code user> | ||
+ | touch smolski-sed.txt && cat >> smolski-sed.txt <<EOF | ||
+ | toto et titi aiment les abricots. | ||
+ | toto préfère les Fraises. | ||
+ | titi les cerises. | ||
+ | TOTo et TITI sont des chipoteurs du jardin. | ||
+ | EOF | ||
+ | </code> | ||
+ | |||
+ | <code user>touch smolski-awk.txt && cat >> smolski-awk.txt <<EOF | ||
+ | 1 3 Nom Genre Age | ||
+ | 2 1 --------------------------------------- | ||
+ | 3 3 CAMILLE M 7 | ||
+ | 4 3 CHLOE F 12 | ||
+ | 5 3 CLARA F 11 | ||
+ | 6 3 CLEMENT M 7 | ||
+ | 7 3 EMMA F 6 | ||
+ | 8 3 THEO M 8 | ||
+ | EOF | ||
+ | </code> | ||
+ | |||
+ | * Utilisation d'une ER et de métacaractère avec awk : | ||
+ | <code user>awk '$3 ~ /(e|E)/' smolski-*</code> | ||
+ | |||
+ | >Affiche les lignes dont la troisième colonne comporte un "e" ou un "E" de TOUS les fichiers du répertoire "~/ERetCMD/Dossier" commençant par "smolski-". | ||
+ | >Le caractère ''~'' (tilde) est un opérateur de correspondance relevant de la commande awk. | ||
+ | >Il permet de tester la correspondance entre la variable ''$3'' et l'expression rationnelle encadrée de ''/'' (''/(e|E)/''). Voir [[utilisateurs:hypathie:tutos:erb-et-ere-par-le-contexte-des-commandes#awk-et-les-caracteres-communs-aux-erb-et-ere|awk et les expressions rationnelles]] | ||
+ | |||
+ | <code> | ||
+ | 3 3 CAMILLE M 7 | ||
+ | 4 3 CHLOE F 12 | ||
+ | 6 3 CLEMENT M 7 | ||
+ | 7 3 EMMA F 6 | ||
+ | 8 3 THEO M 8 | ||
+ | toto préfère les Fraises. | ||
+ | titi les cerises. | ||
</code> | </code> | ||
<note tip> | <note tip> | ||
- | *__sed et awk__\\ Ces commandes étant faites pour travailler le contenu des fichiers, et non pour la recherche de fichiers, elles n'utilisent pas les métacaractères du shell. | + | Pour vi (vim), il faut avoir édité le ou les fichiers pour utiliser les expressions rationnelles, |
+ | mais on peut __utiliser les métacaractères pour ouvrir plusieurs fichiers en même temps__.\\ | ||
+ | |||
+ | Par exemple en étant au niveau du fichier "~/ERetCMD/Dossier" : | ||
+ | |||
+ | <code user>vim smolski-*</code> | ||
+ | |||
+ | Les fichiers "smolski-awk.txt" et "smolski-sed.txt" seront ouverts.\\ | ||
+ | Et pour passer de l'un à l'autre : on tape au clavier '':next'', pour passer au second, si on se trouve devant le premier;\\ | ||
+ | ou '':previous'', si l'on se trouve devant le second et qu'on veut revenir au premier. | ||
+ | D'autres exemples d'utilisation des expressions rationnelles avec [[utilisateurs:hypathie:tutos:erb-et-ere-par-le-contexte-des-commandes#l-editeur-de-texte-vi-n-utilise-aussi-que-les-erb|vim]] seront donnés. | ||
</note> | </note> | ||
- | **Puisque tout est bien clair, nous pouvons aller plus loin, et présenter comment utiliser les programmes GNU/Linux permettant d'utiliser les expressions rationnelles. Cela permettra aussi, non seulement de distinguer ERb, ERe et classes, mais encore de comprendre par leurs usages l'intérêt de conserver ces différents types.** 8-) | + | **Puisque tout est bien clair, nous pouvons aller plus loin, et présenter le détail des expressions rationnelles ainsi que leur utilisation avec les programmes GNU/Linux. Cela permettra, non seulement de distinguer ERb, ERe et classes, mais encore d'en apprécier les différences.** 8-) |
=====Les expressions rationnelles basiques et les commandes GNU/Linux===== | =====Les expressions rationnelles basiques et les commandes GNU/Linux===== | ||
====Caractères communs aux ERb et ERe==== | ====Caractères communs aux ERb et ERe==== | ||
<note tip> | <note tip> | ||
- | * Certains caractères sont communs au ERb et ERe.\\ Pour ne pas avoir à les répéter, il est préférable de les regrouper. D'autant plus que les commandes qui permettent de se servir des expressions rationnelles, reconnaissent tous les caractères communs aux ERb et ERe. | + | * Certains caractères sont communs au ERb et ERe.\\ Il est possible de les regrouper car toutes les commandes qui permettent de se servir des expressions rationnelles, reconnaissent tous les caractères communs aux ERb et ERe. |
- | * Certaines commandes utilisent soit les ERb soit les ERe en fonction d'option :\\ il s'agit de **''grep''** ; **''sed''** ; **''locate''** ; et **''find''**. | + | * Certaines commandes les utilisent soit en tant que ERb, soit en tant que ERe :\\ il s'agit de **''grep''** ; **''sed''** ; **''locate''** ; et **''find''**. |
- | * **''awk''** (gawk) utilise les ERe. | + | * **''awk''** (gawk) les utilise en tant que ERe. |
- | * **''vi''** (vim) et **''expr''** n'utilisent que les ERb. | + | * **''vi''** (vim) et **''expr''** les utilisent en tant que ERb. |
</note> | </note> | ||
Ligne 210: | Ligne 344: | ||
</code> | </code> | ||
- | Voir ci-dessous pour l'utilisation de grep (grep -G) avec [[utilisateurs:hypathie:tutos:erb-et-ere-par-le-contexte-des-commandes?&#grep-ou-grep-g-et-les-caracteres-specifiques-aux-erb|les caractères spécifiques aux ERb]]. | + | Pour l'utilisation de grep (grep -G ou grep -E) avec soit les caractères spécifiques aux ERb, soit les caractères spécifiques aux ERe, voir [[utilisateurs:hypathie:tutos:erb-et-ere-par-le-contexte-des-commandes#grep-e-egrep-et-les-caracteres-specifiques|"grep -E (egrep) et les caractères spécifiques aux ERe"]]. |
</note> | </note> | ||
- | * Soit le fichier "liste1-nom" : | + | ===Préparation === |
- | <code> | + | * Dans le répertoire "~/ERetCMD/" inscrire le contenu suivant dans le fichier "liste1-nom" : |
+ | <code>cd ~/ERetCMD/ && cat >> liste1-nom << EOF | ||
1 2 Francine | 1 2 Francine | ||
2 3 Édith | 2 3 Édith | ||
Ligne 227: | Ligne 362: | ||
6 8 Amanda | 6 8 Amanda | ||
+ | EOF | ||
</code> | </code> | ||
>La dernière ligne du fichier est vide. | >La dernière ligne du fichier est vide. | ||
- | ===le caractère début de ligne ^ === | + | ===Le caractère début de ligne ^ === |
<code user>grep "^4" liste1-nom</code> | <code user>grep "^4" liste1-nom</code> | ||
4 5 Béatrice | 4 5 Béatrice | ||
- | *le caractère fin de ligne $ | + | ===Le caractère fin de ligne $ === |
<code user>grep "e$" liste1-nom</code> | <code user>grep "e$" liste1-nom</code> | ||
1 2 Francine | 1 2 Francine | ||
3 4 Géraldine | 3 4 Géraldine | ||
+ | tout le monde | ||
4 5 Béatrice | 4 5 Béatrice | ||
5 6 Christelle | 5 6 Christelle | ||
Ligne 250: | Ligne 386: | ||
<code user>grep "^$" liste1-nom</code> | <code user>grep "^$" liste1-nom</code> | ||
- | ===le point=== | + | ===Le point=== |
<code user>grep ".dith" liste1-nom</code> | <code user>grep ".dith" liste1-nom</code> | ||
2 3 Édith | 2 3 Édith | ||
- | ===l'étoile=== | + | ===L'étoile=== |
<code user>grep "A*" liste1-nom</code> | <code user>grep "A*" liste1-nom</code> | ||
<code> | <code> | ||
Ligne 273: | Ligne 409: | ||
</code> | </code> | ||
- | > Attention, il ne s'agit pas du métacaractère. Étoile signifie "zéro ou plusieurs 'A'" ; **zéro** fois aussi, donc toutes les lignes dépourvues du caractère "A" apparaissent aussi, y compris la ligne vide. | + | >Encore une fois, il ne s'agit pas du métacaractère. |
+ | >Étoile signifie "zéro ou plusieurs 'A'" ; **zéro** fois aussi. Donc toutes les lignes dépourvues du caractère "A" apparaissent, __y compris la ligne vide__. | ||
+ | |||
+ | * __Autre exemple :__ | ||
<code user>grep "123 A*" liste1-nom</code> | <code user>grep "123 A*" liste1-nom</code> | ||
Ligne 279: | Ligne 418: | ||
123 AAAAAA | 123 AAAAAA | ||
- | ===les crochets=== | + | ===Les crochets=== |
<code user>grep "[43]" liste1-nom</code> | <code user>grep "[43]" liste1-nom</code> | ||
Ligne 287: | Ligne 426: | ||
4 5 Béatrice | 4 5 Béatrice | ||
- | >les lignes comportant 4 ou 3 | + | >Les lignes comportant 4 ou 3 |
- | ===le caractère d'exclusion d'une liste [^ ]=== | + | ===Le caractère d'exclusion d'une liste [^ ]=== |
>Chaîne qui commence ni par 1, ni par 2, ni par aucun des caractères entre crochets. | >Chaîne qui commence ni par 1, ni par 2, ni par aucun des caractères entre crochets. | ||
Ligne 299: | Ligne 438: | ||
toutefois | toutefois | ||
- | *Chaîne qui ne se termine pas par le caractère "e". | + | *Chaîne qui ne se termine pas par l'un des caractères de l'intervalle. |
- | <code user>grep "[^e]$" liste1-nom</code> | + | |
- | + | ||
- | 2 3 Édith | + | |
- | 123 AAAAAA | + | |
- | partout | + | |
- | toutefois | + | |
- | 6 8 Amanda | + | |
- | + | ||
- | *Chaîne qui ne se termine pas l'un des caractères de l'intervalle | + | |
<code user>grep "[^a-z]$" liste1-nom</code> | <code user>grep "[^a-z]$" liste1-nom</code> | ||
Ligne 320: | Ligne 450: | ||
===Le caractère fin de mot \>=== | ===Le caractère fin de mot \>=== | ||
- | <code user>grep "fois\>" liste1-nom </code> | + | <code user>grep "fois\>" liste1-nom</code> |
toutefois | toutefois | ||
- | *Un mot exactement \<mot\> | + | * __Et un mot exactement \<mot\> :__ |
<code user>grep "\<tout\>" liste1-nom</code> | <code user>grep "\<tout\>" liste1-nom</code> | ||
Ligne 340: | Ligne 471: | ||
<note tip> | <note tip> | ||
- | Avec find il faut toujours une option pour utiliser une //ER//.\\ | + | Avec find, il faut toujours une option pour utiliser une //ER//.\\ |
* Pour une expression rationnelle basique :\\ | * Pour une expression rationnelle basique :\\ | ||
Ligne 360: | Ligne 491: | ||
Je ne donnerai ici quelques exemples d'utilisation des caractères communs aux ERb et ERe, en tant que caractères ERb, afin d'illustrer l'utilisation de find avec l'option ''-regextype "posix-basic''.\\ | Je ne donnerai ici quelques exemples d'utilisation des caractères communs aux ERb et ERe, en tant que caractères ERb, afin d'illustrer l'utilisation de find avec l'option ''-regextype "posix-basic''.\\ | ||
- | Pour l'utilisation des caractères spécifiques aux ERb avec find, voir : [[utilisateurs:hypathie:tutos:erb-et-ere-par-le-contexte-des-commandes?&#find-et-les-caracteres-specifiques-aux-erb|find et les caractères spécifiques aux ERb]]\\ | + | Pour l'utilisation des caractères spécifiques aux ERb ou des caractères spécifiques aux ERe avec find, voir : [[utilisateurs:hypathie:tutos:erb-et-ere-par-le-contexte-des-commandes#find-et-les-caracteres-specifiques|"find et les caractères spécifiques aux ERe"]].\\ |
- | Pour l'illustration de find avec les ERe voir : | ||
</note> | </note> | ||
- | * Soit le __répertoire parent__ des fichiers listés ci-dessous : | + | * Rappel des fichiers contenus dans "~/ERetCMD/": |
<code>ls</code> | <code>ls</code> | ||
<code> | <code> | ||
- | Dossier liste1-nom~ server-0.xkb sort2.txt | + | Dossier img-perso-2.jpg liste2-nom server-0.xkb |
- | essai.grep2~ liste2-nom smolski-exo-sed.txt sort3.txt | + | image linux - 01.jpg liste liste3-erb-ere smolski-exo-sed.txt |
- | liste1-nom liste3-erb-ere sort1.txt xxx-sort.txt | + | image linux - 02.jpg liste1 liste4-spec sort1.txt |
+ | image linux - 03.jpg liste1-nom liste4-vim sort2.txt | ||
+ | img-perso-1.jpg liste2 liste-class sort3.txt | ||
</code> | </code> | ||
- | * caractères point et étoiles : | + | * __Caractères point et étoiles :__ |
<code>find -regextype "posix-basic" -regex ".*/li.*m"</code> | <code>find -regextype "posix-basic" -regex ".*/li.*m"</code> | ||
Ligne 380: | Ligne 513: | ||
./liste2-nom | ./liste2-nom | ||
./liste1-nom | ./liste1-nom | ||
+ | ./liste4-vim | ||
</code> | </code> | ||
Ligne 388: | Ligne 522: | ||
<code>find -regextype "posix-basic" -regex ".*/li.*m"</code> | <code>find -regextype "posix-basic" -regex ".*/li.*m"</code> | ||
<code> | <code> | ||
- | ./ERetCMD/liste2-nom | + | ./liste2-nom |
- | ./ERetCMD/liste1-nom | + | ./liste1-nom |
+ | ./liste4-vim | ||
./.config/libreoffice/3/user/gallery/sg100.thm | ./.config/libreoffice/3/user/gallery/sg100.thm | ||
./.config/libreoffice/3/user/gallery/sg30.thm | ./.config/libreoffice/3/user/gallery/sg30.thm | ||
</code> | </code> | ||
- | *Avec les crochets : | + | * __Avec les crochets :__ |
- | >fichiers comportant un "e" ou un "s", plusieurs caractères, un point littéral (\.), plusieurs caractères : | + | >Dans le répertoire "~/ERetCMD/", les fichiers comportant un "e" ou un "s", plusieurs caractères, un point littéral (\.), plusieurs caractères : |
<code user>find -regextype "posix-basic" -regex ".*/[es].*\..*"</code> | <code user>find -regextype "posix-basic" -regex ".*/[es].*\..*"</code> | ||
<code> | <code> | ||
+ | ./Dossier/smolski-sed.txt | ||
+ | ./Dossier/smolski-awk.txt | ||
./smolski-exo-sed.txt | ./smolski-exo-sed.txt | ||
./server-0.xkb | ./server-0.xkb | ||
./sort3.txt | ./sort3.txt | ||
./sort1.txt | ./sort1.txt | ||
- | ./essai.grep2~ | ||
./sort2.txt | ./sort2.txt | ||
</code> | </code> | ||
Ligne 427: | Ligne 563: | ||
--regex | --regex | ||
Interpret all PATTERNs as extended regexps | Interpret all PATTERNs as extended regexps | ||
+ | |||
</code> | </code> | ||
Sans l'une ou l'autre de ces options, locate reconnaît le caractère ''*'' comme un métacaractère du shell.\\ | Sans l'une ou l'autre de ces options, locate reconnaît le caractère ''*'' comme un métacaractère du shell.\\ | ||
- | => Cela a une conséquence par rapport aux caractères ERb qui ne sont pas communs aux ERe.\\ | + | => Encore une fois, si on choisit d'utiliser les ERb, il faudra un antislash pour utiliser [[utilisateurs:hypathie:tutos:erb-et-ere-par-le-contexte-des-commandes?&#caracteres-specifiques-aux-erb|les caractères spécifiques aux ERb]] et ce sera inutile si on choisit les ERe. |
- | Autrement dit, si on choisit d'utiliser les ERb, il faudra un antislash pour utiliser [[utilisateurs:hypathie:tutos:erb-et-ere-par-le-contexte-des-commandes?&#caracteres-specifiques-aux-erb|les caractères spécifiques aux ERb]] et ce sera inutile si on choisit les ERe. | + | |
- | Voir l'utilisation de [[utilisateurs:hypathie:tutos:erb-et-ere-par-le-contexte-des-commandes?&#locate-et-les-caracteres-specifiques-aux-erb|locate avec les caractères spécifiques aux ERb]]. | + | Voir [[utilisateurs:hypathie:tutos:erb-et-ere-par-le-contexte-des-commandes#locate-et-les-caracteres-specifiques|"locate et les caractères spécifiques"]] |
- | *Contrairement à find, __il n'est pas nécessaire que la ER corresponde au chemin absolu d'un fichier__.\\ | + | * Contrairement à find, __il n'est pas nécessaire que la ER corresponde au chemin absolu d'un fichier__.\\ |
Mais la quantité de réponses peut être très élevée, et si l'on a une idée du répertoire dans lequel se trouve le fichier recherché, il peut plus confortable de le préciser.\\ | Mais la quantité de réponses peut être très élevée, et si l'on a une idée du répertoire dans lequel se trouve le fichier recherché, il peut plus confortable de le préciser.\\ | ||
On peut aussi filtrer le retour avec grep.\\ | On peut aussi filtrer le retour avec grep.\\ | ||
Ligne 443: | Ligne 579: | ||
* Enfin, avec l'utilisation de locate, le caractère début (^) est inusité.\\ | * Enfin, avec l'utilisation de locate, le caractère début (^) est inusité.\\ | ||
- | En effet, avec une commande qui recherche des noms de fichier, la seule possibilité serait **''^/''**. Or locate permet justement de ne pas avoir à donner le chemin absolu du fichier recherché. L'utiliser ne ferait qu'allonger inutilement l'expression régulière ! | + | En effet, avec une commande qui recherche des noms de fichier, la seule possibilité serait **''^/''**. Or locate permet justement de ne pas avoir à donner le chemin absolu du fichier recherché. L'utiliser ne ferait qu'allonger inutilement l'expression régulière !\\ |
</note> | </note> | ||
- | * Étoile et point | + | <code root>updatedb</code> |
+ | |||
+ | * __Étoile et point :__ | ||
+ | |||
+ | >Éviter ce qui suit qui donne un retour de plusieurs pages : | ||
<code user>locate --regexp '/home.*[Tt]o.*'</code> | <code user>locate --regexp '/home.*[Tt]o.*'</code> | ||
- | >Donne un retour de plusieurs pages. | + | > On peut faire par exemple : |
<code user>locate --regexp '/home.*[Tt]o.*' | grep "/Dossier/"</code> | <code user>locate --regexp '/home.*[Tt]o.*' | grep "/Dossier/"</code> | ||
Ligne 457: | Ligne 598: | ||
/home/hypathie/ERetCMD/Dossier/tito | /home/hypathie/ERetCMD/Dossier/tito | ||
/home/hypathie/ERetCMD/Dossier/toto | /home/hypathie/ERetCMD/Dossier/toto | ||
- | /home/hypathie/ERetCMD/Dossier/toto. | ||
</code> | </code> | ||
- | * caractère fin de ligne $ : | + | * __Caractère fin de ligne $ :__ |
<code user>locate --regexp '/home.*/Dossier/[Tt]o.*\.txt$'</code> | <code user>locate --regexp '/home.*/Dossier/[Tt]o.*\.txt$'</code> | ||
<code> | <code> | ||
Ligne 467: | Ligne 608: | ||
</code> | </code> | ||
- | * Le caractère début de mot ''\<'' : | + | * __Le caractère début de mot ''\<'' :__ |
<code user>locate --regexp '.*\<smolski.*'</code> | <code user>locate --regexp '.*\<smolski.*'</code> | ||
<code> | <code> | ||
/home/hypathie/ERetCMD/smolski-exo-sed.txt | /home/hypathie/ERetCMD/smolski-exo-sed.txt | ||
+ | /home/hypathie/ERetCMD/Dossier/smolski-awk.txt | ||
+ | /home/hypathie/ERetCMD/Dossier/smolski-sed.txt | ||
</code> | </code> | ||
====La commande sed et les caractères communs aux ERb et ERe==== | ====La commande sed et les caractères communs aux ERb et ERe==== | ||
+ | <note> | ||
Pour les caractères considérés ci-dessus, ''. ; *, ^, $, [liste de caractères], [^liste de caractères], \<, \>'',\\ | Pour les caractères considérés ci-dessus, ''. ; *, ^, $, [liste de caractères], [^liste de caractères], \<, \>'',\\ | ||
__il en va de même pour la commande sed que pour la commande grep__.\\ | __il en va de même pour la commande sed que pour la commande grep__.\\ | ||
Je ne donnerai que quelques exemples.\\ | Je ne donnerai que quelques exemples.\\ | ||
Il est à noter que sans l'option -i, les exemples ne modifieront pas le fichier.\\ | Il est à noter que sans l'option -i, les exemples ne modifieront pas le fichier.\\ | ||
- | Comme grep pour les caractères vues jusqu'ici : | + | </note> |
- | * Les caractère début et fin de ligne : | + | En étant au niveau du répertoire : "~/ERetCMD/". |
- | Par exemple, supprimer la ligne vide : | + | |
+ | * __Les caractère début et fin de ligne :__ | ||
+ | |||
+ | Par exemple, pour supprimer la ligne vide à l'affichage : | ||
<code user>sed '/^$/ d' liste1-nom</code> | <code user>sed '/^$/ d' liste1-nom</code> | ||
- | * Le caractère étoile : | + | * __Le caractère étoile :__ |
Par exemple, substituer "AAAAAA" par abc | Par exemple, substituer "AAAAAA" par abc | ||
Ligne 504: | Ligne 653: | ||
6 8 Amanda | 6 8 Amanda | ||
- | * Le caractère fin de mot : | + | * __Le caractère fin de mot :__ |
- | Par exemple, tout supprimer sauf (''!'')((relève du vocabulaire de sed, et n'est pas un caractère appartenant aux ER)) la ligne correspondant à un mot finissant par "fois" | + | |
+ | Par exemple, tout supprimer sauf (''!'')((relève du vocabulaire de sed, et n'est pas un caractère appartenant aux ER)) la ligne correspondant à un mot finissant par "fois" : | ||
<code user>sed '/fois\>/ !d' liste1-nom</code> | <code user>sed '/fois\>/ !d' liste1-nom</code> | ||
Ligne 511: | Ligne 662: | ||
===Attention au sens global de la ER donné par la commande=== | ===Attention au sens global de la ER donné par la commande=== | ||
+ | |||
Si la signification des caractère est la même, l'action de la commande modifie "la phrase", ou le sens global de la //ER//.\\ | Si la signification des caractère est la même, l'action de la commande modifie "la phrase", ou le sens global de la //ER//.\\ | ||
Comparer l'usage des [^ ] de grep avec ce qui suit : | Comparer l'usage des [^ ] de grep avec ce qui suit : | ||
Ligne 535: | Ligne 687: | ||
====awk et les caractères communs aux ERb et ERe ==== | ====awk et les caractères communs aux ERb et ERe ==== | ||
+ | |||
La commande awk travail sur les colonnes, les lignes, les mots, et constitue un langage de programmation. Je ne rappellerai pas toutes les fonctions de awk mais présenterai seulement comment utiliser les //ER// pour une utilisation basique de cette commande.\\ | La commande awk travail sur les colonnes, les lignes, les mots, et constitue un langage de programmation. Je ne rappellerai pas toutes les fonctions de awk mais présenterai seulement comment utiliser les //ER// pour une utilisation basique de cette commande.\\ | ||
L'usage le plus simple d'awk consiste à utiliser une //ER// pour sélectionner une chaîne.\\ | L'usage le plus simple d'awk consiste à utiliser une //ER// pour sélectionner une chaîne.\\ | ||
Ligne 541: | Ligne 694: | ||
Avec awk la //ER// est encadrée par des slash ''/ER/''. | Avec awk la //ER// est encadrée par des slash ''/ER/''. | ||
- | ===L'étoile === | + | * __L'étoile :__ |
<code user>echo "123 AAAAAA" | awk '/A*/{print $2}'</code> | <code user>echo "123 AAAAAA" | awk '/A*/{print $2}'</code> | ||
Ligne 580: | Ligne 734: | ||
</note> | </note> | ||
- | ===le caractère début de ligne (^) === | + | * __Le caractère début de ligne (^) :__ |
- | * Rappel du fichier "liste1-nom" dont la dernière ligne est vide : | + | |
+ | Visualisation du fichier "liste1-nom" dont la dernière ligne est vide : | ||
<code user>cat liste1-nom</code> | <code user>cat liste1-nom</code> | ||
<code> | <code> | ||
Ligne 615: | Ligne 770: | ||
</note> | </note> | ||
- | ===caractère fin de ligne ($) === | + | * __Caractère fin de ligne ($) :__ |
<code>awk '$3 ~ /ce$/' liste1-nom</code> | <code>awk '$3 ~ /ce$/' liste1-nom</code> | ||
4 5 Béatrice | 4 5 Béatrice | ||
- | ===Caractère point et étoile === | + | * __Caractères point et étoile :__ |
<code user>awk '$3 ~ /.d.*/' liste1-nom</code> | <code user>awk '$3 ~ /.d.*/' liste1-nom</code> | ||
Ligne 632: | Ligne 789: | ||
</code> | </code> | ||
- | ===Les crochets === | + | * __Les crochets :__ |
- | <code user> | + | |
- | awk '$3 ~/t[h]/' liste1-nom</code> | + | <code user>awk '$3 ~/t[h]/' liste1-nom</code> |
>Affiche la ou les lignes dont la chaîne correspond à la //ER// "t" ou "th" | >Affiche la ou les lignes dont la chaîne correspond à la //ER// "t" ou "th" | ||
Ligne 641: | Ligne 798: | ||
5 7 Dorothée | 5 7 Dorothée | ||
- | ===exclusion [^ ] === | + | * __Exclusion [^ ] :__ |
<code user>awk '$1 ~ /^[^12345678]/' liste1-nom</code> | <code user>awk '$1 ~ /^[^12345678]/' liste1-nom</code> | ||
<code> | <code> | ||
Ligne 662: | Ligne 820: | ||
> La seule différence entre ''$1 ~ /^[^12345678]/'' et ''$1 !~ /^[12345678]/'', c'est que la deuxième //ER// affichera une ligne vide, et non la première. | > La seule différence entre ''$1 ~ /^[^12345678]/'' et ''$1 !~ /^[12345678]/'', c'est que la deuxième //ER// affichera une ligne vide, et non la première. | ||
- | ===Début et fin de mot=== | + | * __Début et fin de mot :__ |
<code user>awk '$1 ~ /fois\>/' liste1-nom</code> | <code user>awk '$1 ~ /fois\>/' liste1-nom</code> | ||
Ligne 670: | Ligne 828: | ||
====La commande expr n'utilise que ERb==== | ====La commande expr n'utilise que ERb==== | ||
- | ===Préparation === | + | |
- | Soit le fichier "<nowiki>liste4-spec</nowiki>" : | + | |
- | <code user>cat liste4-spec</code> | + | |
- | <code> | + | |
- | gdd:a:aa:aaa:aaaa:aaaaaa:aaaaaaaa | + | |
- | T5c Kc5 T5 c E2* abcd 7 9Abcd | + | |
- | 7 1AAA.AAA.bcdef aBcd6a 123* | + | |
- | abc2356.99 | + | |
- | 73000|Savoie | + | |
- | 123456 | + | |
- | 1234567 | + | |
- | index-tel|04|Rhône-Alpe | + | |
- | -15 +36 5687 {15} exemple{36} | + | |
- | il y a un truc et un truc et encore un truc et une chose | + | |
- | choses et trucs ne font pas bon ménage | + | |
- | 123.3456.abc | + | |
- | trucschosetruc | + | |
- | tructructrucs | + | |
- | chosechosechose | + | |
- | </code> | + | |
===Syntaxe === | ===Syntaxe === | ||
Ligne 701: | Ligne 840: | ||
* L'expression rationnelle est comparée par rapport au début de la variable, le caractère **''^''** est toujours implicite. | * L'expression rationnelle est comparée par rapport au début de la variable, le caractère **''^''** est toujours implicite. | ||
* Si une partie de l'expression rationnelle est mémorisée avec **''\( \)''** la commande expr affiche dans le terminal la partie correspondante. | * Si une partie de l'expression rationnelle est mémorisée avec **''\( \)''** la commande expr affiche dans le terminal la partie correspondante. | ||
- | |||
</note> | </note> | ||
Ligne 737: | Ligne 875: | ||
</code> | </code> | ||
- | > Le chiffre "1" est le code de retour. | + | > Le chiffre "1" est le code de retour : pas de correspondance, donc code d'erreur. |
* sous chaîne avec caractère fin de mot : | * sous chaîne avec caractère fin de mot : | ||
Ligne 751: | Ligne 889: | ||
====L'éditeur de texte vi n'utilise aussi que les ERb ==== | ====L'éditeur de texte vi n'utilise aussi que les ERb ==== | ||
- | ===Préparation === | + | ===Préparation du fichier "liste4-spec" === |
- | <code user>cat liste4-vim</code> | + | |
- | <code> | + | * Donner le contenu suivant au fichier "liste4-spec" en faisant : |
- | Kc5 T5 c E2* abcd 7 9Abcd | + | |
+ | <code user>cd ~/ERetCMD/ && cat >> liste4-spec <<EOF | ||
+ | gdd:a:aa:aaa:aaaa:aaaaaa:aaaaaaaa | ||
+ | T5c Kc5 T5 c E2* abcd 7 9Abcd | ||
7 1AAA.AAA.bcdef aBcd6a 123* | 7 1AAA.AAA.bcdef aBcd6a 123* | ||
abc2356.99 | abc2356.99 | ||
73000|Savoie | 73000|Savoie | ||
+ | 123456 | ||
+ | 1234567 | ||
index-tel|04|Rhône-Alpe | index-tel|04|Rhône-Alpe | ||
-15 +36 5687 {15} exemple{36} | -15 +36 5687 {15} exemple{36} | ||
il y a un truc et un truc et encore un truc et une chose | il y a un truc et un truc et encore un truc et une chose | ||
- | chose et truc ne font pas bon ménage | + | choses et trucs ne font pas bon ménage |
123.3456.abc | 123.3456.abc | ||
- | trucchosetruc | + | trucschosetruc |
- | tructructruc | + | tructructrucs |
chosechosechose | chosechosechose | ||
+ | EOF | ||
</code> | </code> | ||
Ligne 792: | Ligne 936: | ||
</note> | </note> | ||
- | * Éditer le fichier "liste4-vim" : | + | * Éditer le fichier "liste4-vim" en faisant : |
- | * Pour éditer le fichier avec vi ou vim : | + | |
- | <code user>vi liste4-vim</code> | + | <code user>vi liste4-spec</code> |
ou | ou | ||
- | <code user>vim liste4-vim</code> | + | <code user>vim liste4-spec</code> |
{{http://pix.toile-libre.org/upload/original/1407922486.png?400}} | {{http://pix.toile-libre.org/upload/original/1407922486.png?400}} | ||
Ligne 832: | Ligne 975: | ||
===Exemples de recherches === | ===Exemples de recherches === | ||
- | * le caractère début de ligne ^ | + | |
+ | * __Le caractère début de ligne ^ __ | ||
<code> | <code> | ||
/^chose | /^chose | ||
Ligne 838: | Ligne 983: | ||
On appuie sur la touche shift+: pour inscrire ''/'', on inscrit sa ER, on valide avec la touche "entrée". vi ou vim surligne toutes les occurrences de "chose" qui sont en début de ligne. | On appuie sur la touche shift+: pour inscrire ''/'', on inscrit sa ER, on valide avec la touche "entrée". vi ou vim surligne toutes les occurrences de "chose" qui sont en début de ligne. | ||
- | <code>nohlsearch</code> | + | <code>:nohlsearch</code> |
Pour retirer la surbrillance de la recherche. | Pour retirer la surbrillance de la recherche. | ||
- | * le caractère fin de ligne $ | + | * __Le caractère fin de ligne $__ |
<code> | <code> | ||
/chose$ | /chose$ | ||
</code> | </code> | ||
- | On valide avec entrée, et ''nohlsearch'' pour effacer | + | On valide avec entrée, et '':nohlsearch'' pour effacer |
- | + | ||
===Exemples de substitution=== | ===Exemples de substitution=== | ||
- | * crochets : | + | * __Crochets :__ |
<code> | <code> | ||
:s/[Ss]/XXX/g | :s/[Ss]/XXX/g | ||
</code> | </code> | ||
+ | |||
>Substitue les caractères "S" ou "s" à la ligne du curseur et surligne toutes les occurrences potentiellement substituables. | >Substitue les caractères "S" ou "s" à la ligne du curseur et surligne toutes les occurrences potentiellement substituables. | ||
- | > **''nohlsearch''** pour retirer la surbrillance. | + | > **'':nohlsearch''** pour retirer la surbrillance. |
- | >puis pour annuler la substitution "Échap", puis appuyer sur la lettre "u" ("u" pour annuler un seul changement, "U" pour annuler plusieurs changement sur une ligne. | + | >puis pour annuler la substitution "Échap" (pour être sûr de ne pas être en mode insertion), puis appuyer sur la lettre "u" ("u" pour annuler un seul changement, ("U" pour annuler plusieurs changements). |
+ | |||
+ | * __idem sur tout le texte :__ | ||
- | * idem sur tout le texte : | ||
<code> | <code> | ||
:1,$s/[Ss]/XXX/g | :1,$s/[Ss]/XXX/g | ||
Ligne 866: | Ligne 1013: | ||
>"1,$" est l'adressage qui signifie de la première ligne à la fin. | >"1,$" est l'adressage qui signifie de la première ligne à la fin. | ||
- | * sous-chaîne avec parenthèses et accolades : | + | * __Sous-chaîne avec parenthèses et accolades :__ |
<code> | <code> | ||
- | /\([0-9]\{3\}.\)\{2\} | + | /\([0-9]\{3\}.\)\{2\}\.</code> |
- | </code> | + | |
- | Vi ou vim surligne à la ligne 9 (comportant "123.3456.abc") la sous-chaîne **''123.3456.''**. | + | >Vi ou vim surligne à la ligne 9 (comportant "123.3456.abc") la sous-chaîne **''123.3456.''**. |
Ligne 877: | Ligne 1025: | ||
<note tip> | <note tip> | ||
- | Je présenterai ici les commandes qui utilisent uniquement les ERb, c'est-à-dire, celles qui n'ont pas besoin d'une option pour utiliser les expressions rationnelles et qui n'utilisent que les expressions rationnelles basiques, et donc forcément les caractères spécifiques aux ERb.\\ | + | Je présenterai d'abord les commandes qui utilisent uniquement les ERb, c'est-à-dire, celles qui n'ont pas besoin d'une option pour utiliser les expressions rationnelles et qui n'utilisent que les expressions rationnelles basiques, et donc forcément les caractères spécifiques aux ERb.\\ |
Il s'agit de **''expr''** et **''vi''**.\\ | Il s'agit de **''expr''** et **''vi''**.\\ | ||
- | Elles utilisent bien sûr tous [[utilisateurs:hypathie:tutos:erb-et-ere-par-le-contexte-des-commandes?&#caracteres-communs-aux-erb-et-ere|les caractères communs aux ERb et ERe]], leur utilisation avec ces caractères apparaîtra en à côté de l'utilisation des caractères spécifiques aux ERb qui permettent de décrire des motifs plus complexes. | ||
- | Pour les commandes "à option" qui utilisent tous les caractères spécifiques aux ERb, mais qui peuvent aussi utiliser ces mêmes caractères((parenthèses, accolades, +, ? et |)) sans antislash avec les ERe, je présenterai rapidement leur utilisation des ERb dans le chapitre sur les caractères spécifiques aux ERe. | + | Je présenterai ensuite les commandes "à option" qui utilisent tous les caractères spécifiques aux ERb, mais qui peuvent aussi utiliser ces mêmes caractères((parenthèses, accolades, +, ? et |)) sans antislash avec les ERe.\\ |
+ | |||
+ | Ainsi tous les caractères des expressions rationnelles auront été abordés ainsi que leurs divers contextes d'utilisation. Il ne restera plus qu'à présenter [[utilisateurs:hypathie:tutos:erb-et-ere-par-le-contexte-des-commandes#les-classes|les classes]]. | ||
</note> | </note> | ||
Ligne 1051: | Ligne 1200: | ||
</note> | </note> | ||
- | ===== grep, sed, find, locate, awk et les caractères spécifiques aux ERe ===== | + | =====Caractères spécifiques aux ERb ou caractères spécifiques aux ERe ===== |
+ | <note tip> | ||
+ | **grep**, **sed**, **find**, **locate** utilisent soit les expressions rationnelles basiques, soit les étendues.\\ Précisons à cette occasion, comment s'utilisent les caractères spécifiques des expressions rationnelles étendues. | ||
+ | |||
+ | **awk** (gawk) utilise seulement les expressions rationnelles étendues; voir [[utilisateurs:hypathie:tutos:erb-et-ere-par-le-contexte-des-commandes#awk-les-ere-et-les-classes|awk, les ERe et les classes]] | ||
+ | </note> | ||
===Préparation=== | ===Préparation=== | ||
Ligne 1074: | Ligne 1228: | ||
</code> | </code> | ||
- | ==== grep -E (egrep) et les caractères spécifiques aux ERe==== | + | ==== grep -E (egrep) et les caractères spécifiques==== |
Avec l'option -E grep utilisent les expressions rationnelles étendues.\\ | Avec l'option -E grep utilisent les expressions rationnelles étendues.\\ | ||
La commande egrep et un équivalent. | La commande egrep et un équivalent. | ||
Ligne 1169: | Ligne 1323: | ||
===Exemples === | ===Exemples === | ||
- | * Substituer "Hello" par "OK" : | + | * __Substituer "Hello" par "OK" :__ |
<code user>echo "coucou Hello Yep" | sed -r 's/[A-Z]{1}[a-z]{4}/OK/g'</code> | <code user>echo "coucou Hello Yep" | sed -r 's/[A-Z]{1}[a-z]{4}/OK/g'</code> | ||
Ligne 1176: | Ligne 1330: | ||
</code> | </code> | ||
- | * Substituer "a" et "aa" par "OK" : | + | * __Substituer "a" et "aa" par "OK" :__ |
<code user>echo "a aa aaa aaaa aaaaaa aaaaaaaa" | sed -re 's/(a{1} )/OK/'\ | <code user>echo "a aa aaa aaaa aaaaaa aaaaaaaa" | sed -re 's/(a{1} )/OK/'\ | ||
Ligne 1189: | Ligne 1343: | ||
</note> | </note> | ||
- | ====find et les caractères spécifiques aux ERe " ==== | + | ====find et les caractères spécifiques==== |
__**Rappel **__\\ | __**Rappel **__\\ | ||
Ligne 1199: | Ligne 1353: | ||
__**Préparation**__\\ | __**Préparation**__\\ | ||
- | Dans le répertoire de l'utilisateur soit le répertoire "ERetCMD/" contenant : | + | Rappel : le répertoire "ERetCMD/" contient : |
<code> | <code> | ||
- | Dossier img-perso-2.jpg liste3-erb-ere sort1.txt | + | Dossier img-perso-2.jpg liste2-nom server-0.xkb |
- | essai.grep2~ liste liste4-spec sort2.txt | + | image linux - 01.jpg liste liste3-erb-ere smolski-exo-sed.txt |
- | image linux - 01.jpg liste1 liste4-vim sort3.txt | + | image linux - 02.jpg liste1 liste4-spec sort1.txt |
- | image linux - 02.jpg liste1-nom liste-class vim2.png | + | image linux - 03.jpg liste1-nom liste4-vim sort2.txt |
- | image linux - 03.jpg liste2 server-0.xkb vim.png | + | img-perso-1.jpg liste2 liste-class sort3.txt |
- | img-perso-1.jpg liste2-nom smolski-exo-sed.txt xxx-sort.txt | + | |
</code> | </code> | ||
===Exemples === | ===Exemples === | ||
- | * accolades (depuis le répertoire parent "ERetCMD/" des fichiers recherchés : | + | * __Les accolades__ (depuis le répertoire parent "ERetCMD/" des fichiers recherchés : |
<code user>find -regextype "posix-basic" -regex ".*/[a-z]\{,3\}-.*\.jpg$"</code> | <code user>find -regextype "posix-basic" -regex ".*/[a-z]\{,3\}-.*\.jpg$"</code> | ||
<code> | <code> | ||
Ligne 1226: | Ligne 1379: | ||
</code> | </code> | ||
- | * caractère ? : | + | * __Le caractère ? :__ |
<code user>find -regextype "posix-basic" -regex ".*/liste.\?"</code> | <code user>find -regextype "posix-basic" -regex ".*/liste.\?"</code> | ||
<code> | <code> | ||
Ligne 1234: | Ligne 1388: | ||
</code> | </code> | ||
- | * le caractère + (depuis le répertoire parent "ERetCMD/" des fichiers) : | + | * __Le caractère +__ (depuis le répertoire parent "ERetCMD/" des fichiers) : |
<code user>find -regextype "posix-extended" -regex ".*liste.+"</code> | <code user>find -regextype "posix-extended" -regex ".*liste.+"</code> | ||
<code> | <code> | ||
Ligne 1247: | Ligne 1401: | ||
</code> | </code> | ||
- | ====locate et les caractères spécifiques aux ERe ==== | + | ====locate et les caractères spécifiques==== |
__**Rappel**__\\ | __**Rappel**__\\ | ||
Ligne 1253: | Ligne 1407: | ||
De même que précédemment, on peut choisir l'option **''--regexp''** pour utiliser les caractères spécifiques aux ERb qui nécessitent **''\''**. | De même que précédemment, on peut choisir l'option **''--regexp''** pour utiliser les caractères spécifiques aux ERb qui nécessitent **''\''**. | ||
- | Soit encore le répertoire "ERetCMD/" contenant les mêmes fichiers (voir find).\\ | + | Soit encore le répertoire "ERetCMD/" contenant les mêmes fichiers.\\ |
Mise à jour de la base de donnée, si besoin : | Mise à jour de la base de donnée, si besoin : | ||
Ligne 1261: | Ligne 1415: | ||
===Exemples === | ===Exemples === | ||
- | * parenthèses et accolades (depuis n'importe où dans l'arborescence du système de fichiers) : | + | * __Parenthèses et accolades__ (depuis n'importe où dans l'arborescence du système de fichiers) : |
<code user>locate --regexp '\([a-z]\{1,\} \)\{2\}.*\.jpg$'</code> | <code user>locate --regexp '\([a-z]\{1,\} \)\{2\}.*\.jpg$'</code> | ||
Ligne 1270: | Ligne 1424: | ||
/home/hypathie/ERetCMD/image linux - 03.jpg | /home/hypathie/ERetCMD/image linux - 03.jpg | ||
</code> | </code> | ||
+ | |||
+ | > D'autres fichiers que ceux du répertoire "~/ERetCMD/" et créés pour les exemples peuvent apparaître. | ||
ou | ou | ||
Ligne 1281: | Ligne 1437: | ||
</code> | </code> | ||
- | * caractère ? : | + | * __Caractère ? :__ |
<code user>locate --regex '/liste.?'</code> | <code user>locate --regex '/liste.?'</code> | ||
<code> | <code> | ||
Ligne 1300: | Ligne 1457: | ||
>Le fichier "liste" (sans extension) apparaît. | >Le fichier "liste" (sans extension) apparaît. | ||
- | * caractère + : | + | * __Caractère + :__ |
<code user>locate --regex '/liste.+'</code> | <code user>locate --regex '/liste.+'</code> | ||
Ligne 1318: | Ligne 1475: | ||
- | >Le fichier "liste" (sans extension) n'apparaît pas. | + | >Le fichier "liste" (sans extension) n'apparaît plus. |
=====Les classes ===== | =====Les classes ===== | ||
Ligne 1342: | Ligne 1499: | ||
====grep, grep -E et les classes==== | ====grep, grep -E et les classes==== | ||
La commande grep utilise les classes soit comme ERb et soit comme ERe, c'est-à-dire sans l'option -E ou avec l'option -E | La commande grep utilise les classes soit comme ERb et soit comme ERe, c'est-à-dire sans l'option -E ou avec l'option -E | ||
+ | |||
===Préparation === | ===Préparation === | ||
* soit le fichier " | * soit le fichier " | ||
- | <code user>cat liste-class</code> | + | <code user>cd ~/ERetCMD/ && cat >> liste-class <<EOF |
- | <code> | + | |
gdd:a:aa:aaa:aaaa:aaaaaa:aaaaaaaa | gdd:a:aa:aaa:aaaa:aaaaaa:aaaaaaaa | ||
T5c Kc5 T5 c E2* abcd 7 9Abcd | T5c Kc5 T5 c E2* abcd 7 9Abcd | ||
Ligne 1356: | Ligne 1513: | ||
-15 +36 5687 {15} exemple{36} | -15 +36 5687 {15} exemple{36} | ||
123.3456.abc | 123.3456.abc | ||
+ | EOF | ||
</code> | </code> | ||
Ligne 1370: | Ligne 1528: | ||
</code> | </code> | ||
- | >sélection de "3456" ; "5687" ; de "2356" ; et des lignes avec plus de 4 chiffres consécutif. | + | >Sélection de "3456" ; "5687" ; de "2356" ; et des lignes avec plus de 4 chiffres consécutif. |
<code user>grep "[[:digit:]]\{6\}" liste-class</code> | <code user>grep "[[:digit:]]\{6\}" liste-class</code> | ||
Ligne 1414: | Ligne 1572: | ||
====locate et les classes, ERb ou ERe==== | ====locate et les classes, ERb ou ERe==== | ||
- | * Visualisation du répertoire ~/ERetCMD/ : | + | * Rappel du contenu de "~/ERetCMD/" : |
<code user>ls</code> | <code user>ls</code> | ||
<code> | <code> | ||
- | Dossier img-perso-1.jpg liste3-erb-ere smolski-exo-sed.txt | + | Dossier img-perso-2.jpg liste2-nom server-0.xkb |
- | essai.grep2~ img-perso-2.jpg liste4-spec sort1.txt | + | image linux - 01.jpg liste liste3-erb-ere smolski-exo-sed.txt |
- | image linux - 01.jpg liste1-nom liste4-spec~ sort2.txt | + | image linux - 02.jpg liste1 liste4-spec sort1.txt |
- | image linux - 02.jpg liste1-nom~ liste4-vim sort3.txt | + | image linux - 03.jpg liste1-nom liste4-vim sort2.txt |
- | image linux - 03.jpg liste2-nom server-0.xkb xxx-sort.txt | + | img-perso-1.jpg liste2 liste-class sort3.txt |
</code> | </code> | ||
- | ===sous-chaîne avec classes dans une ERb=== | + | ===Sous-chaîne avec classes dans une ERb=== |
>Option --regexp et on met un antislash de toutes les parenthèses et les accolades. | >Option --regexp et on met un antislash de toutes les parenthèses et les accolades. | ||
Ligne 1435: | Ligne 1593: | ||
</code> | </code> | ||
- | ===sous-chaîne avec classes dans une ERe=== | + | >D'autres fichiers créés avant l'exercice peuvent apparaître. |
+ | |||
+ | ===Sous-chaîne avec classes dans une ERe=== | ||
>Idem mais avec option --regex et on enlève les ''\'' inutiles avec les ERe | >Idem mais avec option --regex et on enlève les ''\'' inutiles avec les ERe | ||
Ligne 1514: | Ligne 1674: | ||
</code> | </code> | ||
- | ====la commande expr utilise les classes en tant ERb==== | + | ====La commande expr utilise les classes en tant ERb==== |
* Exemple 1 : | * Exemple 1 : | ||
Ligne 1535: | Ligne 1695: | ||
====vi (vim) utilise les classes en tant que ERb==== | ====vi (vim) utilise les classes en tant que ERb==== | ||
===Préparation === | ===Préparation === | ||
- | <code user>vim liste4-vim</code> | + | <code user>vim liste4-spec</code> |
- | <code> | + | |
- | Kc5 T5 c E2* abcd 7 9Abcd | + | {{http://pix.toile-libre.org/upload/original/1408097498.png?400}} |
- | 7 1AAA.AAA.bcdef aBcd6a 123* | + | |
- | abc2356.99 | + | |
- | 73000|Savoie | + | |
- | index-tel|04|Rhône-Alpe | + | |
- | -15 +36 5687 {15} exemple{36} | + | |
- | il y a un truc et un truc et encore un truc et une chose | + | |
- | chose et truc ne font pas bon ménage | + | |
- | 123.3456.abc | + | |
- | trucchosetruc | + | |
- | tructructruc | + | |
- | chosechosechose | + | |
- | </code> | + | |
===Exemples === | ===Exemples === | ||
Ligne 1556: | Ligne 1705: | ||
<code>/[[:alnum:]]\{7\}{[[:digit:]]\{2\}} </code> | <code>/[[:alnum:]]\{7\}{[[:digit:]]\{2\}} </code> | ||
- | -> sélectionne entièrement la chaîne **''exemple{36}''** | + | {{http://pix.toile-libre.org/upload/original/1408097922.png?400}} |
* Substitution <nowiki>[[:graph:]]</nowiki>: | * Substitution <nowiki>[[:graph:]]</nowiki>: | ||
<code>:6,10s/[[:graph:]]/x/g</code> | <code>:6,10s/[[:graph:]]/x/g</code> | ||
- | > Le caractère "ô" n'est pas concerné du fait de la touche morte. | + | {{http://pix.toile-libre.org/upload/original/1408098079.png?400}} |
+ | |||
+ | > Les caractères accentués ne sont pas concernés car ils comportent un caractère de contrôle pour l'accentuation avec la touche morte. | ||
+ | |||
+ | > Faire **'':nohlsearch''** et **''u''** pour la suite. | ||
- | {{http://pix.toile-libre.org/upload/original/1407925315.png?400}} | ||
* Substitution <nowiki>[[:print:]]</nowiki> : | * Substitution <nowiki>[[:print:]]</nowiki> : | ||
<code>:6,10s/[[:print:]]/x/g</code> | <code>:6,10s/[[:print:]]/x/g</code> | ||
- | {{http://pix.toile-libre.org/upload/original/1407925697.png?400}} | + | {{http://pix.toile-libre.org/upload/original/1408098434.png?400}} |
- | ====awk utilise les ERe et les classes sans option==== | + | > Cette fois les caractères accentués sont concernés s'ils font partie de l'adressage. |
- | <code user>cat liste2-nom</code> | + | > Faire **'':q!''** pour quitter sans enregistrer. |
- | <code> | + | |
+ | =====awk les ERe et les classes===== | ||
+ | <code user>cd ~/ERetCMD && cat >> liste2-nom <<EOF | ||
Constance 20-03-1998 | Constance 20-03-1998 | ||
Rebecca 09-03-1999 | Rebecca 09-03-1999 | ||
Ligne 1579: | Ligne 1733: | ||
Hélène-Fleur 06-03-2005 | Hélène-Fleur 06-03-2005 | ||
Samuel 27-08-2008 | Samuel 27-08-2008 | ||
+ | EOF | ||
</code> | </code> | ||
Ligne 1596: | Ligne 1751: | ||
- | ======Raccourcis et commandes====== | + | =====Raccourcis et programmes d'édition===== |
Les raccourcis ne sont pas posix | Les raccourcis ne sont pas posix | ||
- | === __sed__ :=== | + | ====sed ==== |
^Séquences ^Séquences ^ | ^Séquences ^Séquences ^ | ||
Ligne 1612: | Ligne 1767: | ||
|**''<nowiki>\b</nowiki>''** | Correspond à une chaîne vide (blanc) à l'extrémité d'un mot | | |**''<nowiki>\b</nowiki>''** | Correspond à une chaîne vide (blanc) à l'extrémité d'un mot | | ||
- | === __awk__ :=== | + | ====awk==== |
^Séquences ^Séquences ^ | ^Séquences ^Séquences ^ |