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 [15/08/2014 10:01] Hypathie [Introduction] |
utilisateurs:hypathie:tutos:erb-et-ere-par-le-contexte-des-commandes [15/08/2014 12:37] Hypathie [Introduction] |
||
---|---|---|---|
Ligne 25: | Ligne 25: | ||
**Pour en prendre le contre-pied, cette présentation des expressions rationnelles souhaite éclairer leurs divers utilisations ainsi que la nécessité de leurs diversités, en les exposant du point de vue des commandes de recherches et d'édition de fichiers GNU/linux.**\\ | **Pour en prendre le contre-pied, cette présentation des expressions rationnelles souhaite éclairer leurs divers utilisations ainsi que la nécessité de leurs diversités, en les exposant du point de vue des commandes de recherches et d'édition de fichiers GNU/linux.**\\ | ||
- | **En bref, il s'agira de donner accès à l'utilisation, en ligne de commandes ou dans des scripts shell GNU/linux, des 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.** |
====Les types de ER ==== | ====Les types de ER ==== | ||
Ligne 98: | Ligne 98: | ||
===Métacaractère ou caractère d'expression rationnelle ?=== | ===Métacaractère ou caractère d'expression rationnelle ?=== | ||
- | * L'étoile : | + | * __L'étoile__ : |
Imaginons qu'on cherche __tous les fichiers commençant par "t"__ contenant le caractère "e".\\ | Imaginons qu'on cherche __tous les fichiers commençant par "t"__ contenant le caractère "e".\\ | ||
Ligne 112: | Ligne 112: | ||
> 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> | ||
titi1:documentation | titi1:documentation | ||
Ligne 122: | Ligne 126: | ||
</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 137: | Ligne 139: | ||
</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. | ||
Ligne 157: | Ligne 159: | ||
//Depuis le répertoire personnel ou le répertoire "~ERetCMD" ou même le répertoire "~/ERetCMD/Dossier/"// | //Depuis le répertoire personnel ou le répertoire "~ERetCMD" ou même le répertoire "~/ERetCMD/Dossier/"// | ||
- | *Étoile : | + | * __Étoile__ : |
<code user>find ~/ERetCMD/Dossier/ -name "toto*"</code> | <code user>find ~/ERetCMD/Dossier/ -name "toto*"</code> | ||
Ligne 164: | Ligne 166: | ||
</code> | </code> | ||
- | * Le point d'interrogation : | + | * __Le point d'interrogation :__ |
<code user>find ~/ERetCMD/Dossier/ -name "titi?"</code> | <code user>find ~/ERetCMD/Dossier/ -name "titi?"</code> | ||
Ligne 172: | Ligne 174: | ||
</code> | </code> | ||
- | * Crochets : | + | * __Crochets :__ |
<code user>find ~/ERetCMD/Dossier/ -name "[Tt][io]t[io]?"</code> | <code user>find ~/ERetCMD/Dossier/ -name "[Tt][io]t[io]?"</code> | ||
Ligne 182: | Ligne 184: | ||
===locate === | ===locate === | ||
- | * Préparation : | + | * __Préparation :__ |
Se déplacer dans le répertoire "~/ERetCMD/" ; y créer les fichiers suivants en faisant : | Se déplacer dans le répertoire "~/ERetCMD/" ; y créer les fichiers suivants en faisant : | ||
Ligne 223: | Ligne 225: | ||
===sed=== | ===sed=== | ||
- | * Prépararation : | + | * __sed utilise aussi les deux :__ |
Vérifier qu'on est bien au niveau du "~/ERetCMD/Dossier/" | Vérifier qu'on est bien au niveau du "~/ERetCMD/Dossier/" | ||
Ligne 245: | Ligne 248: | ||
===awk === | ===awk === | ||
- | *Préparation : | + | * __De même encore pour awk :__ |
Dans le dossier "~/ERetCMD/Dossier" créer les fichiers "smolski-awk.txt" et "smolski-sed.txt": | Dans le dossier "~/ERetCMD/Dossier" créer les fichiers "smolski-awk.txt" et "smolski-sed.txt": | ||
<code user> | <code user> | ||
Ligne 286: | Ligne 290: | ||
<note tip> | <note tip> | ||
- | Pour vi (vim), il faut avoir ouvert le fichier pour utiliser les expressions rationnelles, | + | 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.\\ | + | 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" : | Par exemple en étant au niveau du fichier "~/ERetCMD/Dossier" : | ||
Ligne 372: | Ligne 376: | ||
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 403: | Ligne 408: | ||
</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 417: | Ligne 425: | ||
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 [^ ]=== | ||
Ligne 429: | Ligne 437: | ||
toutefois | toutefois | ||
- | *Chaîne qui ne se termine pas l'un des caractères de l'intervalle. | + | *Chaîne qui ne se termine pas par 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 441: | Ligne 449: | ||
===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 486: | Ligne 495: | ||
- | * 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 500: | Ligne 512: | ||
./liste2-nom | ./liste2-nom | ||
./liste1-nom | ./liste1-nom | ||
+ | ./liste4-vim | ||
</code> | </code> | ||
Ligne 508: | Ligne 521: | ||
<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 557: | Ligne 572: | ||
- | *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 563: | Ligne 578: | ||
* 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 577: | Ligne 597: | ||
/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 587: | Ligne 607: | ||
</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> |
+ | |||
+ | En étant au niveau du répertoire : "~/ERetCMD/". | ||
+ | |||
+ | * __Les caractère début et fin de ligne :__ | ||
- | * Les caractère début et fin de ligne : | + | Par exemple, pour supprimer la ligne vide à l'affichage : |
- | Par exemple, supprimer la ligne vide : | + | |
<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 624: | Ligne 652: | ||
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 631: | Ligne 661: | ||
===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 655: | Ligne 686: | ||
====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 661: | Ligne 693: | ||
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 700: | Ligne 733: | ||
</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 735: | Ligne 769: | ||
</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 752: | Ligne 788: | ||
</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 761: | Ligne 797: | ||
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 782: | Ligne 819: | ||
> 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 790: | Ligne 827: | ||
====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 821: | Ligne 839: | ||
* 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 857: | Ligne 874: | ||
</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 871: | Ligne 888: | ||
====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 912: | Ligne 935: | ||
</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 952: | Ligne 974: | ||
===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 958: | Ligne 982: | ||
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 986: | Ligne 1012: | ||
>"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 1295: | Ligne 1322: | ||
===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 1302: | Ligne 1329: | ||
</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 1325: | Ligne 1352: | ||
__**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 1352: | Ligne 1378: | ||
</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 1360: | Ligne 1387: | ||
</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 1379: | Ligne 1406: | ||
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 1387: | Ligne 1414: | ||
===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 1396: | Ligne 1423: | ||
/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 1407: | Ligne 1436: | ||
</code> | </code> | ||
- | * caractère ? : | + | * __Caractère ? :__ |
<code user>locate --regex '/liste.?'</code> | <code user>locate --regex '/liste.?'</code> | ||
<code> | <code> | ||
Ligne 1426: | Ligne 1456: | ||
>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 1444: | Ligne 1474: | ||
- | >Le fichier "liste" (sans extension) n'apparaît pas. | + | >Le fichier "liste" (sans extension) n'apparaît plus. |
=====Les classes ===== | =====Les classes ===== | ||
Ligne 1468: | Ligne 1498: | ||
====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 1482: | Ligne 1512: | ||
-15 +36 5687 {15} exemple{36} | -15 +36 5687 {15} exemple{36} | ||
123.3456.abc | 123.3456.abc | ||
+ | EOF | ||
</code> | </code> | ||
Ligne 1496: | Ligne 1527: | ||
</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 1540: | Ligne 1571: | ||
====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 1561: | Ligne 1592: | ||
</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 1640: | Ligne 1673: | ||
</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 1661: | Ligne 1694: | ||
====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 1682: | Ligne 1704: | ||
<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}} |
+ | |||
+ | > Cette fois les caractères accentués sont concernés s'ils font partie de l'adressage. | ||
+ | > Faire **'':q!''** pour quitter sans enregistrer. | ||
=====awk les ERe et les classes===== | =====awk les ERe et les classes===== | ||
- | <code user>cat liste2-nom</code> | + | <code user>cd ~/ERetCMD && cat >> liste2-nom <<EOF |
- | <code> | + | |
Constance 20-03-1998 | Constance 20-03-1998 | ||
Rebecca 09-03-1999 | Rebecca 09-03-1999 | ||
Ligne 1705: | Ligne 1732: | ||
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> | ||