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 [13/08/2014 08:13] Hypathie [grep, sed, find, locate et les caractères spécifiques aux ERb] |
utilisateurs:hypathie:tutos:erb-et-ere-par-le-contexte-des-commandes [13/08/2014 17:31] Hypathie [grep, sed, find, locate et les caractères spécifiques aux ERb] |
||
---|---|---|---|
Ligne 3: | Ligne 3: | ||
* Objet : maîtriser les expressions rationnelles basiques et étendues ainsi que les classes POSIX | * Objet : maîtriser les expressions rationnelles basiques et étendues ainsi que les classes POSIX | ||
* Niveau requis : {{avisé}} | * Niveau requis : {{avisé}} | ||
- | * Commentaires : utiliser les expressions rationnelles basiques, étendues, les classes avec grep, grep -E, find, locate, expr, vi (vim), sed et awk. | + | * Commentaires : utiliser les expressions rationnelles basiques, étendues, les classes avec grep, grep -E, find, locate, expr, vi, sed et awk. |
**NOTA**\\ | **NOTA**\\ | ||
Ligne 39: | Ligne 39: | ||
* les classes POSIX (considérer soit comme ERb, soit comme ERe selon les programmes | * les classes POSIX (considérer soit comme ERb, soit comme ERe selon les programmes | ||
- | Les raccourcis (par exemples, retour à la ligne ''\n'', tabulation ''\t'') étant particuliers aux programmes, seront listés en complément mais ne seront pas exemplifiés. | + | Les raccourcis (par exemples, retour à la ligne ''\n'', tabulation ''\t'') étant particuliers aux programmes, seront listés en complément. |
- | ==== Panorama exhaustif des programmes GNU/Linux concernés par les ERE=== | + | ==== Panorama exhaustif des programmes GNU/Linux concernés par les expressions rationnelles=== |
* **expr** : **ERb**\\ pour la correspondance de chaîne de caractères avec une expression régulière. | * **expr** : **ERb**\\ pour la correspondance de chaîne de caractères avec une expression régulière. | ||
Ligne 47: | Ligne 47: | ||
* **find** : **ERb** en le précisant avec l'option **''-regextype "posix-basic"''** ou **ERe** en précisant avec l'option **''-regextype "posix-extended"''**\\ rechercher de fichier en fonction du motif spécifié par la //ER//. | * **find** : **ERb** en le précisant avec l'option **''-regextype "posix-basic"''** ou **ERe** en précisant avec l'option **''-regextype "posix-extended"''**\\ rechercher de fichier en fonction du motif spécifié par la //ER//. | ||
* **locate** : **ERb** avec l'option **''- -regexp''** ou **ERe** avec l'option **''- -regex''**\\ recherche de fichiers selon un motif dans la base de données. | * **locate** : **ERb** avec l'option **''- -regexp''** ou **ERe** avec l'option **''- -regex''**\\ recherche de fichiers selon un motif dans la base de données. | ||
- | * **vi** (**vim**) : **ERb**\\ recherche et substitution de chaîne de caractères. | + | * **vi** : **ERb**\\ recherche et substitution de chaîne de caractères. |
* **egrep** ou **grep -E** : **ERe**\\ Même usage que grep | * **egrep** ou **grep -E** : **ERe**\\ Même usage que grep | ||
* **sed** : **ERb**\\ par exemple, sélectionne, modifie les chaînes d'un fichier ou de l'affichage en se basant sur les colonnes. La //ER// permet de sélectionner quelle(s) colonne(s) est (sont) concernée(s). | * **sed** : **ERb**\\ par exemple, sélectionne, modifie les chaînes d'un fichier ou de l'affichage en se basant sur les colonnes. La //ER// permet de sélectionner quelle(s) colonne(s) est (sont) concernée(s). | ||
Ligne 221: | Ligne 221: | ||
</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]]. | ||
</note> | </note> | ||
Ligne 350: | Ligne 351: | ||
<note tip> | <note tip> | ||
- | Ce qui donne :\\ | + | Avec find il faut toujours une option pour utiliser une //ER//.\\ |
+ | |||
+ | * Pour une expression rationnelle basique :\\ | ||
<code> | <code> | ||
- | find -regextype "posix-basic" -regex "ERb" | + | find -regextype "posix-basic" -regex "son-expression-rationnelle-basique" |
</code> | </code> | ||
- | L'option -regextype posix-basic permet de définir le type de ER qu'on souhaite utiliser.\\ | + | * Pour une expression rationnelle étendue :\\ |
+ | <code> | ||
+ | find -regextype "posix-extended" -regex "son-expression-rationnelle-étendue" | ||
+ | </code> | ||
+ | |||
+ | * Il faut aussi prévenir find, qu'on va utiliser une ER avec :((de même qu'on prévient qu'on cherche un motif en respectant la casse avec ''-name'')) | ||
+ | * **''-regex ER''** | ||
+ | * **''-iregex motif''** : Semblable à -regex, pour ne pas tenir compte de la casse (ne pas différencier les majuscules et les minuscules). | ||
+ | |||
+ | * Il s'agit d'une correspondance sur __le chemin complet__.\\ Pour représenter un chemin absolu quelque soit-il, il faut ajouter en début d'expression **''.*''**. | ||
+ | |||
+ | 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''.\\ | ||
- | Il faut aussi prévenir find, qu'on va utiliser une ER avec :((de même qu'on prévient qu'on cherche un motif en respectant la casse avec ''-name'')) | + | 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]]\\ |
- | * **''-regex ER''** | + | |
- | * **''-iregex motif''** : Semblable à -regex, pour ne pas tenir compte de la casse (ne pas différencier les majuscules et les minuscules). | + | |
- | Il s'agit d'une correspondance sur __le chemin complet__.\\ Pour représenter un chemin absolu quelqu'il soit, il faut mettre en début d'expression **''.*''**. | + | Pour l'illustration de find avec les ERe voir : |
</note> | </note> | ||
- | Je ne donnerai que quelques exemples, puisque tous les caractères de ERb sont utilisables. \\ Je m'attacherai surtout à la syntaxe et au contexte d'utilisation des //ER// relatifs à find. | ||
* Soit le __répertoire parent__ des fichiers listés ci-dessous : | * Soit le __répertoire parent__ des fichiers listés ci-dessous : | ||
Ligne 409: | Ligne 420: | ||
====La commande locate et les caractères communs aux ERb et ERe==== | ====La commande locate et les caractères communs aux ERb et ERe==== | ||
+ | |||
<note tip> | <note tip> | ||
- | Pour utiliser les ERb, il faut utiliser l'option : | + | Pour utiliser les //ER// avec locate, il faut dans tous les cas une option.\\ |
+ | Les caractères communs aux ERb et ERe, peuvent être utilisés avec l'une ou l'autre de ces options : | ||
+ | |||
+ | * __Pour utiliser les ERb, il faut utiliser l'option__ : | ||
+ | |||
+ | <code man locate> | ||
+ | --regexp REGEXP | ||
+ | Search for a basic regexp REGEXP. No PATTERNs are allowed if | ||
+ | this option is used, but this option can be specified multiple | ||
+ | times. | ||
+ | </code> | ||
+ | |||
+ | * __Pour utiliser ces mêmes caractères en tant que ERe il faut utiliser l'option__ : | ||
+ | <code man locate> | ||
+ | --regex | ||
+ | Interpret all PATTERNs as extended regexps | ||
+ | </code> | ||
+ | |||
+ | 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.\\ | ||
+ | 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. | ||
- | <code>--regexp</code> | + | 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]]. |
- | Sinon, locate reconnaît le caractère ''*'' comme un métacaractère du shell.\\ | ||
- | 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, si 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.\\ | ||
- | 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 ! | ||
Ligne 655: | Ligne 687: | ||
- | =====Caractères spécifiques aux ERb ===== | + | =====Caractères spécifiques aux ERb et ERe ===== |
- | Les commandes utilisent les caractères spécifiques aux expressions rationnelles basiques:\\ | + | |
- | grep (ou grep -G) ; find -regextype "posix-basic" ; locate --regexp ; sed (sans option) ; vi (vim) ; expr | + | <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.\\ | ||
+ | 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. | ||
+ | </note> | ||
+ | |||
+ | ====Caractères spécifiques aux ERb ==== | ||
+ | |||
+ | Toutes les commandes utilisant les expressions rationnelles basiques utilisent les caractères énumérés ci-dessous.\\ | ||
+ | |||
+ | La commande **''expr''** n'utilise que ceux-ci.\\ | ||
^expressions ^Modèles reconnus ^ | ^expressions ^Modèles reconnus ^ | ||
Ligne 666: | Ligne 711: | ||
|**''<nowiki>\1, \2, ...</nowiki>''** | Rappel de mémorisation | | |**''<nowiki>\1, \2, ...</nowiki>''** | Rappel de mémorisation | | ||
- | Les commandes grep, vi (vim), locate, find utilisent aussi les caractères spécifiques suivants : | + | Les commandes **''grep''** (ou **''grep -G''**) ; **''find -regextype "posix-basic" ''** ; |
+ | **''locate --regexp''** ; **''sed''**; **''vi''** utilisent en plus ces caractères ci-dessous : | ||
^ ^ ^ | ^ ^ ^ | ||
Ligne 672: | Ligne 718: | ||
|**''<nowiki>\+</nowiki>''** | une ou plusieurs fois l'élément précédent | | |**''<nowiki>\+</nowiki>''** | une ou plusieurs fois l'élément précédent | | ||
|**''<nowiki>\|</nowiki>''** | alternative | | |**''<nowiki>\|</nowiki>''** | alternative | | ||
- | |||
- | |||
-> Le caractère **''\''** donne une signification spéciale aux parenthèses et accolades, ?, +, | au lieu de les rendre littérales.\\ | -> Le caractère **''\''** donne une signification spéciale aux parenthèses et accolades, ?, +, | au lieu de les rendre littérales.\\ | ||
Mais il permet de rendre littéraux les autres caractères des ERb, par exemple ''\.'' permet de sélectionner un point. | Mais il permet de rendre littéraux les autres caractères des ERb, par exemple ''\.'' permet de sélectionner un point. | ||
- | <note tip> | ||
- | Je présenterai principalement les commandes "spécifiques" aux ERb, c'est-à-dire, celles qui n'ont pas la possibilité d'utiliser les ERE, vi (vim) et expr.\\ | ||
- | Elles utilisent bien sûr tous les caractères ERb et pas seulement les caractères spécifiques aux ERb. | ||
- | Je ne ferai ici qu'un bref rappel des autres commandes qui peuvent utiliser (en changeant d'option) les ERe plus lisibles((plus de ''\'' devant parenthèses, accolades, +, ? et |)). | + | ====Caractères spécifiques aux ERe ==== |
- | </note> | + | |
+ | Les caractères spécifiques aux ERe sont utilisables avec les commandes : | ||
+ | |||
+ | **''grep -E''** ; (ou **''egrep''**) ; **''find -regextype "posix-extended" ''** ; | ||
+ | **''locate --regex''** ; **''sed -r''** et **''awk''**((alias gawk)).\\ | ||
+ | |||
+ | Bien évidemment 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]] sont utilisables avec ces commandes et ces options. | ||
+ | |||
+ | ^expressions ^ Modèles reconnus ^ | ||
+ | |**''?''** | zéro ou une fois le caractère ou le regroupement précédent | | ||
+ | |**''+''** |une à n fois le caractère ou regroupement précédent | | ||
+ | |**''<nowiki>{m}</nowiki>''** |m fois le caractère précédent | | ||
+ | |**''<nowiki>{m,}</nowiki>''** | m fois le caractère précédent | | ||
+ | |**''<nowiki>{m,n}</nowiki>''** | entre m et n fois le caractère précédent | | ||
+ | |**''<nowiki>( er1)</nowiki>''** | regroupement | | ||
+ | |**''<nowiki>er1|er2|er3</nowiki>''** | alternative | | ||
+ | |**''<nowiki>(er)+</nowiki>''**|Une ou plus de une chaîne(s) consécutive(s) validée(s) "er".| | ||
+ | |**''<nowiki>(er)*</nowiki>''**|zéro ou plus de zéro chaîne(s) consécutive(s) validée(s) par "er" | | ||
+ | |**''<nowiki>(er)?</nowiki>''**|une chaîne bulle ou toute chaîne validée par "er".| | ||
+ | |**''<nowiki>[c1c2...]</nowiki>''**|Tout caractère expressément listé entre les crochets.| | ||
+ | |**''<nowiki>[^c1c2...]</nowiki>''**|Tout caractère excepté ceux qui sont expressément listés entre les crochets.| | ||
+ | |**''<nowiki>[c1-c2]</nowiki>''**|Tout caractère appartenant à l’intervalle c1 c2, bornes comprises.| | ||
+ | |**''<nowiki>er1|er2</nowiki>''**|Toute chaîne de caractères validée soit par er1 soit par er2.| | ||
+ | |**''<nowiki>(er)(er)</nowiki>''**|Toute chaîne validée par l’expression er, chaîne vide exclue.| | ||
+ | |**''<nowiki>(er1)(er2)</nowiki>''**|Toute chaîne de caractères de type AB, dans laquelle l’expression régulière er1 valide A et l’expression régulière er2 valide B.\\ Avec awk uniquement| | ||
+ | |||
+ | =====Les commandes expr et vi et les caractères spécifiques aux ERb ===== | ||
====La commande expr n'utilise que ERb==== | ====La commande expr n'utilise que ERb==== | ||
Ligne 695: | Ligne 762: | ||
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 | ||
</code> | </code> | ||
Ligne 715: | Ligne 784: | ||
* 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. | ||
+ | * **''expr''** utilise tous les [[utilisateurs:hypathie:tutos:erb-et-ere-par-le-contexte-des-commandes?&#caracteres-communs-aux-erb-et-ere|caractères communs aux ERb et ERe]] | ||
+ | * mais elle n'utilise que les caractères spécifiques aux ERb ci-dessous : | ||
+ | |||
+ | |**''<nowiki>\{m\}</nowiki>''** | m fois le caractère précédent | | ||
+ | |**''<nowiki>\{m,\} </nowiki>''** | au moins m fois le caractère précédent | | ||
+ | |**''<nowiki>\{m,n\} </nowiki>''** | entre m et n fois le caractère précédent | | ||
+ | |**''<nowiki>\(ERb\)</nowiki>''** | mémorisation d'une ERb | | ||
+ | |**''<nowiki>\1, \2, ...</nowiki>''** | Rappel de mémorisation | | ||
+ | |||
</note> | </note> | ||
Ligne 750: | Ligne 828: | ||
> Le chiffre "1" est le code de retour. | > Le chiffre "1" est le code de retour. | ||
- | |||
* sous chaîne avec caractère fin de mot : | * sous chaîne avec caractère fin de mot : | ||
Ligne 801: | Ligne 878: | ||
<note tip> | <note tip> | ||
- | Modes utilises dans ce qui suit\\ | + | Modes utilisés dans ce qui suit :\\ |
Ligne 811: | Ligne 888: | ||
* Pour tester ce qui suit si vous ne connaissez pas vi ou vim :\\ | * Pour tester ce qui suit si vous ne connaissez pas vi ou vim :\\ | ||
- | *Après installation de vim, créer un fichier, par exemple "liste4-vim" : '' vim liste4-vim '' | + | *Après [[doc:editeurs:vim:vim#installation|installation de vim]], créer un fichier, par exemple "liste4-vim" : '' vim liste4-vim '' |
- | *Copier le contenu de "liste4-vim" ci-dessus ; | + | * Copier le contenu de "liste4-vim" ci-dessus ; |
- | *coller dans le fichier "liste4-vim" édité avec vim en faisant : | + | * Pour coller dans le fichier "liste4-vim" édité avec vim : |
* touche <majuscule de droite> + touche <inser> (cela fait que l'on est en mode insertion) | * touche <majuscule de droite> + touche <inser> (cela fait que l'on est en mode insertion) | ||
* sortir du mode insertion : touche "Échap" | * sortir du mode insertion : touche "Échap" | ||
- | * enregistrez : '' :wq '' et touche <entrée> | + | * enregistrer et sortir : '' :wq '' et touche <entrée> |
- | * En plus des [[utilisateurs:hypathie:tutos:erb-et-ere-par-le-contexte-des-commandes?&#caracteres-specifiques-aux-erb|caractères spécifiques aux ERb]] vi (vim) utilise les caractères spécifiques aux ERb ci-dessous (comme grep): | + | * vi (vim) utilise 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]], tous [[utilisateurs:hypathie:tutos:erb-et-ere-par-le-contexte-des-commandes?&#caracteres-specifiques-aux-erb|les caractères spécifiques aux ERb]], y compris ceux ci-dessous (comme "les commandes à option" permettant de choisir le type //ER//): |
|**''<nowiki>\?</nowiki>''** | zéro ou une fois l'élément précédent | | |**''<nowiki>\?</nowiki>''** | zéro ou une fois l'élément précédent | | ||
Ligne 831: | Ligne 908: | ||
</note> | </note> | ||
+ | * Éditer le fichier "liste4-vim" : | ||
+ | * Pour éditer le fichier avec vi ou vim : | ||
+ | |||
+ | <code user>vi liste4-vim</code> | ||
+ | ou | ||
+ | <code user>vim liste4-vim</code> | ||
+ | |||
+ | {{http://pix.toile-libre.org/upload/original/1407922486.png?400}} | ||
===Syntaxe d'utilisation des ER=== | ===Syntaxe d'utilisation des ER=== | ||
Ligne 902: | Ligne 987: | ||
</code> | </code> | ||
- | >"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. |
* utilisation de \| : | * utilisation de \| : | ||
<code>/c\|t</code> | <code>/c\|t</code> | ||
- | >surligne tous les "c" et tous les "t" du fichier. | + | ->Une image vaut mieux qu'une description :\\ |
+ | {{http://pix.toile-libre.org/upload/original/1407937898.png?400}} | ||
* Utilisation de \? : | * Utilisation de \? : | ||
<code>/\.[0-9]\?</code> | <code>/\.[0-9]\?</code> | ||
- | ->Une image vaut mieux qu'une description :\\ | + | -> Là aussi :\\ |
{{http://pix.toile-libre.org/upload/original/1407857157.png?400}} | {{http://pix.toile-libre.org/upload/original/1407857157.png?400}} | ||
Ligne 933: | Ligne 1019: | ||
</note> | </note> | ||
- | ===== grep, sed, find, locate et les caractères spécifiques aux ERb ===== | + | ===== grep, sed, find, locate, awk et les caractères spécifiques aux ERe ===== |
- | Les commandes grep et sed sans option, les commandes locate --regexp et find -regextype “posix-basic” avec option utilisent les caractères spécifiques aux ERb.\\ Puisqu'il est plus pratique de les utiliser avec les ERe qui sont plus lisibles, je n'en donnerai que quelques exemples ici. | + | ===Préparation=== |
- | * Rappel du fichier "<nowiki>liste4-spec</nowiki>": | + | * Soit le fichier "<nowiki>liste4-spec</nowiki>": |
<code> | <code> | ||
gdd:a:aa:aaa:aaaa:aaaaaa:aaaaaaaa | gdd:a:aa:aaa:aaaa:aaaaaa:aaaaaaaa | ||
Ligne 956: | Ligne 1042: | ||
</code> | </code> | ||
- | ==== grep ==== | + | ==== grep -E (egrep) et les caractères spécifiques aux ERe==== |
+ | Avec l'option -E grep utilisent les expressions rationnelles étendues.\\ | ||
+ | La commande egrep et un équivalent. | ||
- | * les accolades avec antislash (le caractère précédent un nombre exact de fois) : | + | <note tip> |
+ | Pour les caractères : **'' <nowiki>[</nowiki> <nowiki>]</nowiki> <nowiki>{</nowiki> <nowiki>}</nowiki> ? + |''**\\ | ||
+ | |||
+ | il possible avec grep d'utiliser aussi les caractères spécifiques aux ERb.\\ | ||
+ | Par exemple :\\ | ||
<code user>grep "1A\{3\}\.A\{3\}\..*" liste4-spec</code> | <code user>grep "1A\{3\}\.A\{3\}\..*" liste4-spec</code> | ||
+ | ou | ||
+ | |||
+ | <code user>grep -G "1A\{3\}\.A\{3\}\..*" liste4-spec</code> | ||
+ | |||
<code> | <code> | ||
7 1AAA.AAA.bcdef aBcd6a 123* | 7 1AAA.AAA.bcdef aBcd6a 123* | ||
</code> | </code> | ||
- | * mais on peut utiliser le caractère \+ : | + | -> mais ne pas oublier l'antislash devant les accolades !\\ |
- | <code user>grep "\(1A\{3\}\.\)\+.*" liste4-spec</code> | + | </note> |
+ | |||
+ | ===Parenthèses === | ||
+ | |||
+ | <code user>grep -E "( [0-9]{4})" liste4-spec</code> | ||
<code> | <code> | ||
- | 7 1AAA.AAA.bcdef aBcd6a 123* | + | -15 +36 5687 {15} exemple{36} |
</code> | </code> | ||
- | + | ===le caractère précédent de "n" à "m" fois :=== | |
- | * le caractère précédent de "n" à "m" fois : | + | <code user>grep -E "[0-9]{1,3}" liste4-spec</code> |
- | <code user>grep "[0-9]\{1,3\}" liste4-spec</code> | + | |
<code> | <code> | ||
T5c Kc5 T5 c E2* abcd 7 9Abcd | T5c Kc5 T5 c E2* abcd 7 9Abcd | ||
Ligne 978: | Ligne 1077: | ||
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} | ||
Ligne 983: | Ligne 1084: | ||
</code> | </code> | ||
- | * le caractère précédent au moins "n" fois : | + | ===Les accolades (le caractère précédent un nombre exact de fois) : === |
- | <code user>grep "[0-9]\{4,\}" liste4-spec</code> | + | <code user>grep -E "1A{3}\.A{3}\..*" liste4-spec</code> |
+ | <code> | ||
+ | 7 1AAA.AAA.bcdef aBcd6a 123* | ||
+ | </code> | ||
+ | |||
+ | ===Le caractère précédent au moins "n" fois :=== | ||
+ | <code user>grep -E "[0-9]{4,}" liste4-spec</code> | ||
<code> | <code> | ||
abc2356.99 | abc2356.99 | ||
Ligne 992: | Ligne 1099: | ||
</code> | </code> | ||
- | * parenthèses avec antislash et mémorisation : | + | ===Le caractère + et parenthèses === |
- | <code user>grep "\( [0-9]\{4\}\)" liste4-spec</code> | + | <code user>grep -E "(1A{3}\.)+.*" liste4-spec</code> |
<code> | <code> | ||
- | -15 +36 5687 {15} exemple{36} | + | 7 1AAA.AAA.bcdef aBcd6a 123* |
</code> | </code> | ||
- | * Le caractère \? : | + | ===Le caractère ? === |
- | <code user>grep "trucs\?" liste4-spec</code> | + | <code user>grep -E "trucs?" liste4-spec</code> |
<code> | <code> | ||
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 | ||
Ligne 1010: | Ligne 1117: | ||
>On cherche les lignes qui comporte "truc" au singulier ou au pluriel. | >On cherche les lignes qui comporte "truc" au singulier ou au pluriel. | ||
- | ====sed sans option utilise les ERb ==== | + | ===Le caractère d'alternative | === |
- | La syntaxe est la même que pour les caractères communs aux ERe. | + | <code user>grep -E "(truc|chose)" liste4-spec</code> |
+ | <code> | ||
+ | il y a un truc et un truc et encore un truc et une chose | ||
+ | choses et trucs ne font pas bon ménage | ||
+ | trucschosetruc | ||
+ | tructructrucs | ||
+ | chosechosechose | ||
+ | </code> | ||
+ | |||
+ | ====sed et les caractères spécifiques aux ERe ==== | ||
+ | __**Rappel**__\\ | ||
+ | |||
+ | Par défaut sed utilise les ERb.\\ | ||
+ | Pour s'éviter de mettre un antislash devant parenthèse, accolade, ?, +, |,\\ il faut utiliser **l'option -r**.\\ | ||
+ | |||
+ | Sans option et avec l'antislash le signification de ces caractères sont les mêmes que lors de leur utilisation avec l'option -r. | ||
+ | |||
+ | ===Exemples === | ||
* Substituer "Hello" par "OK" : | * Substituer "Hello" par "OK" : | ||
- | <code user>echo "coucou Hello Yep" | sed '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> |
<code> | <code> | ||
coucou OK Yep | coucou OK Yep | ||
Ligne 1022: | Ligne 1146: | ||
* Substituer "a" et "aa" par "OK" : | * Substituer "a" et "aa" par "OK" : | ||
- | <code user>echo "a aa aaa aaaa aaaaaa aaaaaaaa" | sed -e 's/\(a\{1\} \)/OK/'\ | + | <code user>echo "a aa aaa aaaa aaaaaa aaaaaaaa" | sed -re 's/(a{1} )/OK/'\ |
- | -e 's/\(a\{2\} \)/OK/'</code> | + | -e 's/(a{2} )/OK/'</code> |
<code> | <code> | ||
OKOKaaa aaaa aaaaaa aaaaaaaa | OKOKaaa aaaa aaaaaa aaaaaaaa | ||
Ligne 1029: | Ligne 1153: | ||
<note tip> | <note tip> | ||
- | La lisibilité devient vite difficile pour sélectionner des sous-chaîne avec les ERb.\\ | + | L'antislash de la commande précédente permet de couper les longues commandes.\\ |
- | Mieux vaut donc passer aux ERe, quand les commandes peuvent les utiliser.\\ | + | Ne pas confondre avec l'antislash utiliser pour les ERb et les caractères spécifiques, parenthèses, accolades, etc. |
- | C'est justement le cas de la commande sed, locate et find. Je ne m'y attarderai donc pas. | + | |
</note> | </note> | ||
- | ====locate utilise les ERb avec l'option --regexp ==== | + | ====find et les caractères spécifiques aux ERe " ==== |
+ | __**Rappel **__\\ | ||
- | === Préparation=== | + | Pour utiliser les ERe, il faut utiliser l'option **''-regextype "posix-extended" ''**.\\ |
- | Dans le répertoire de l'utilisateur et dans le dosssier "ERetCMD/" : | + | |
- | * Création de trois fichiers : "image linux - 01.jpg", "image linux - 02.jpg" et "image linux - 03.jpg" : | + | Pour les caractères **'' <nowiki>[</nowiki> <nowiki>]</nowiki> <nowiki>{</nowiki> <nowiki>}</nowiki> ? + ''**, on peut là aussi choisir les ERb en mettant un antislash devant.\\ |
+ | Pour ce faire, il faut alors utiliser l'option **''-regextype "posix-basic" ''**. | ||
- | <code user> | + | __**Préparation**__\\ |
- | touch image\ linux\ -\ 01.jpg image\ linux\ -\ 02.jpg image\ linux\ -\ 03.jpg | + | |
+ | Dans le répertoire de l'utilisateur soit le répertoire "ERetCMD/" contenant : | ||
+ | |||
+ | <code> | ||
+ | Dossier img-perso-2.jpg liste3-erb-ere sort1.txt | ||
+ | essai.grep2~ liste liste4-spec sort2.txt | ||
+ | image linux - 01.jpg liste1 liste4-vim sort3.txt | ||
+ | image linux - 02.jpg liste1-nom liste-class vim2.png | ||
+ | image linux - 03.jpg liste2 server-0.xkb vim.png | ||
+ | img-perso-1.jpg liste2-nom smolski-exo-sed.txt xxx-sort.txt | ||
</code> | </code> | ||
- | * Visualisation : | + | ===Exemples === |
- | <code user>ls</code> | + | * accolades (depuis le répertoire parent "ERetCMD/" des fichiers recherchés : |
+ | <code user>find -regextype "posix-basic" -regex ".*/[a-z]\{,3\}-.*\.jpg$"</code> | ||
<code> | <code> | ||
- | Dossier img-perso-1.jpg liste3-erb-ere smolski-exo-sed.txt | + | ./img-perso-2.jpg |
- | essai.grep2~ img-perso-2.jpg liste4-spec sort1.txt | + | ./img-perso-1.jpg |
- | image linux - 01.jpg liste1-nom liste4-spec~ sort2.txt | + | |
- | image linux - 02.jpg liste1-nom~ liste4-vim sort3.txt | + | |
- | image linux - 03.jpg liste2-nom server-0.xkb xxx-sort.txt | + | |
</code> | </code> | ||
- | * Mise à jour de la base de donnée : | + | ou |
+ | |||
+ | <code user>find -regextype "posix-extended" -regex ".*[a-z]{,3}-.*\.jpg$"</code> | ||
+ | <code> | ||
+ | ./img-perso-2.jpg | ||
+ | ./img-perso-1.jpg | ||
+ | </code> | ||
+ | |||
+ | * caractère ? : | ||
+ | <code user>find -regextype "posix-basic" -regex ".*/liste.\?"</code> | ||
+ | <code> | ||
+ | ./ERetCMD/liste1 | ||
+ | ./ERetCMD/liste | ||
+ | ./ERetCMD/liste2 | ||
+ | </code> | ||
+ | |||
+ | * le caractère + (depuis le répertoire parent "ERetCMD/" des fichiers) : | ||
+ | <code user>find -regextype "posix-extended" -regex ".*liste.+"</code> | ||
+ | <code> | ||
+ | ./liste2-nom | ||
+ | ./liste1-nom | ||
+ | ./liste3-erb-ere | ||
+ | ./liste4-vim | ||
+ | ./liste1 | ||
+ | ./liste4-spec | ||
+ | ./liste2 | ||
+ | ./liste-class | ||
+ | </code> | ||
+ | |||
+ | ====locate et les caractères spécifiques aux ERe ==== | ||
+ | __**Rappel**__\\ | ||
+ | |||
+ | Pour utiliser les ERe, il faut utiliser l'option **''--regex''**.\\ | ||
+ | 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).\\ | ||
+ | |||
+ | Mise à jour de la base de donnée, si besoin : | ||
<code root> | <code root> | ||
updatedb | updatedb | ||
</code> | </code> | ||
- | ===Exemple === | + | ===Exemples === |
- | <code user>locate --regexp '.*\([a-z]\{1,\} \)\{2\}.*\.jpg$'</code> | + | * 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> | <code> | ||
/home/Téléchargements/Les utilitaires awk, nawk et gawk - Tutoriel_fichiers/logo.jpg | /home/Téléchargements/Les utilitaires awk, nawk et gawk - Tutoriel_fichiers/logo.jpg | ||
Ligne 1069: | Ligne 1239: | ||
</code> | </code> | ||
+ | ou | ||
+ | <code user>locate --regex '([a-z]{1,} ){2}.*\.jpg$'</code> | ||
+ | <code> | ||
+ | /home/Téléchargements/Les utilitaires awk, nawk et gawk - Tutoriel_fichiers/logo.jpg | ||
+ | /home/hypathie/ERetCMD/image linux - 01.jpg | ||
+ | /home/hypathie/ERetCMD/image linux - 02.jpg | ||
+ | /home/hypathie/ERetCMD/image linux - 03.jpg | ||
+ | </code> | ||
- | ====find utilise les ERb avec l'option -regextype "posix-basic" ==== | + | * caractère ? : |
+ | <code user>locate --regex '/liste.?'</code> | ||
+ | <code> | ||
+ | /home/hypathie/Documents/PYTHON/python2/chap06/liste_et_branch.py | ||
+ | /home/hypathie/Documents/PYTHON/python3/chap06/liste_et_branch.py | ||
+ | /home/hypathie/ERetCMD/liste | ||
+ | /home/hypathie/ERetCMD/liste-class | ||
+ | /home/hypathie/ERetCMD/liste1 | ||
+ | /home/hypathie/ERetCMD/liste1-nom | ||
+ | /home/hypathie/ERetCMD/liste2 | ||
+ | /home/hypathie/ERetCMD/liste2-nom | ||
+ | /home/hypathie/ERetCMD/liste3-erb-ere | ||
+ | /home/hypathie/ERetCMD/liste4-spec | ||
+ | /home/hypathie/ERetCMD/liste4-vim | ||
+ | /usr/share/man/man2/listen.2.gz | ||
+ | </code> | ||
- | ===Préparation=== | + | >Le fichier "liste" (sans extension) apparaît. |
- | Dans le répertoire de l'utilisateur et dans le dossier "ERetCMD/" | + | |
- | * Création de deux fichiers, "img-perso-1.jpg" et "img-perso-2.jpg" : | + | * caractère + : |
- | <code user> | + | <code user>locate --regex '/liste.+'</code> |
- | touch img-perso-1.jpg img-perso-2.jpg | + | <code> |
+ | /home/hypathie/Documents/PYTHON/python2/chap06/liste_et_branch.py | ||
+ | /home/hypathie/Documents/PYTHON/python3/chap06/liste_et_branch.py | ||
+ | /home/hypathie/ERetCMD/liste-class | ||
+ | /home/hypathie/ERetCMD/liste1 | ||
+ | /home/hypathie/ERetCMD/liste1-nom | ||
+ | /home/hypathie/ERetCMD/liste2 | ||
+ | /home/hypathie/ERetCMD/liste2-nom | ||
+ | /home/hypathie/ERetCMD/liste3-erb-ere | ||
+ | /home/hypathie/ERetCMD/liste4-spec | ||
+ | /home/hypathie/ERetCMD/liste4-vim | ||
+ | /usr/share/man/man2/listen.2.gz | ||
</code> | </code> | ||
- | ===exemples === | ||
- | <code user>find -regextype "posix-basic" -regex ".*/[a-z]\{,3\}-.*\.jpg$"</code> | + | >Le fichier "liste" (sans extension) n'apparaît pas. |
- | <code> | + | |
- | ./img-perso-2.jpg | + | |
- | ./img-perso-1.jpg | + | |
- | </code> | + | |
=====Les classes ===== | =====Les classes ===== | ||
Ligne 1324: | Ligne 1522: | ||
* Recherche : | * Recherche : | ||
- | <code>/[[:alnum:]]\{7\}\.[[:digit:]]\{2\} </code> | + | <code>/[[:alnum:]]\{7\}{[[:digit:]]\{2\}} </code> |
- | -> sélectionne entièrement la ligne **''abc2356.99''** | + | -> sélectionne entièrement la chaîne **''exemple{36}''** |
- | * Substitution : | + | * Substitution <nowiki>[[:graph:]]</nowiki>: |
- | <code>:3,4s/[[:graph:]]/x/g</code> | + | <code>:6,10s/[[:graph:]]/x/g</code> |
- | -> les ligne 3 et 4 ne présentent plus que des "x", tous les caractères susceptibles d'être concernés par la //ER// sont surlignés, c'est-à-dire tous le texte sauf les espaces. | + | > Le caractère "ô" n'est pas concerné du fait de la touche morte. |
- | -> Information sur les substitutions : ''22 substitutions, sur 2 lignes'' | + | {{http://pix.toile-libre.org/upload/original/1407925315.png?400}} |
+ | |||
+ | * Substitution <nowiki>[[:print:]]</nowiki> : | ||
+ | <code>:6,10s/[[:print:]]/x/g</code> | ||
+ | |||
+ | {{http://pix.toile-libre.org/upload/original/1407925697.png?400}} | ||
====awk utilise les ERe et les classes sans option==== | ====awk utilise les ERe et les classes sans option==== | ||
Ligne 1361: | Ligne 1564: | ||
- | ======Les expressions rationnelles étendues====== | + | ======Raccourcis et commandes====== |
- | ====Caractères des ERe ==== | + | |
- | ^expressions ^ Modèles reconnus ^ | ||
- | |**''?''** | zéro ou une fois le caractère ou le regroupement précédent | | ||
- | |**''+''** |une à n fois le caractère ou regroupement précédent | | ||
- | |**''<nowiki>{m}</nowiki>''** |m fois le caractère précédent | | ||
- | |**''<nowiki>{m,}</nowiki>''** | m fois le caractère précédent | | ||
- | |**''<nowiki>{m,n}</nowiki>''** | entre m et n fois le caractère précédent | | ||
- | |**''<nowiki>( er1)</nowiki>''** | regroupement | | ||
- | |**''<nowiki>er1|er2|er3</nowiki>''** | alternative | | ||
- | |**''<nowiki>(er)+</nowiki>''**|Une ou plus de une chaîne(s) consécutive(s) validée(s) "er".| | ||
- | |**''<nowiki>(er)*</nowiki>''**|zéro ou plus de zéro chaîne(s) consécutive(s) validée(s) par "er" | | ||
- | |**''<nowiki>(er)?</nowiki>''**|une chaîne bulle ou toute chaîne validée par "er".| | ||
- | |**''<nowiki>[c1c2...]</nowiki>''**|Tout caractère expressément listé entre les crochets.| | ||
- | |**''<nowiki>[^c1c2...]</nowiki>''**|Tout caractère excepté ceux qui sont expressément listés entre les crochets.| | ||
- | |**''<nowiki>[c1-c2]</nowiki>''**|Tout caractère appartenant à l’intervalle c1 c2, bornes comprises.| | ||
- | |**''<nowiki>er1|er2</nowiki>''**|Toute chaîne de caractères validée soit par er1 soit par er2.| | ||
- | |**''<nowiki>(er)(er)</nowiki>''**|Toute chaîne validée par l’expression er, chaîne vide exclue.| | ||
- | |**''<nowiki>(er1)(er2)</nowiki>''**|Toute chaîne de caractères de type AB, dans laquelle l’expression régulière er1 valide A et l’expression régulière er2 valide B.\\ Avec awk uniquement| | ||
- | Excepté **''<nowiki>(er1)(er2)</nowiki>''** : | + | Les raccourcis ne sont pas posix |
- | === avec awk (sans option)=== | + | === __sed__ :=== |
- | + | ||
- | ===avec grep -E et egrep=== | + | |
- | <code user>grep -E "1([A-Z]){2}.*" liste4-spec</code> | + | |
- | <code> | + | |
- | 7 1AAA.AAA.bcdef aBcd6a 123* | + | |
- | </code> | + | |
- | + | ||
- | ===avec sed -r=== | + | |
- | + | ||
- | ===avec locate === | + | |
- | <code man locate> | + | |
- | --regex | + | |
- | Interpret all PATTERNs as extended regexps. | + | |
- | </code> | + | |
- | + | ||
- | * Syntaxe : | + | |
- | <code> | + | |
- | locate --regex 'ERe' | + | |
- | </code> | + | |
- | + | ||
- | ===avec find === | + | |
- | <code man find> | + | |
- | -regextype type | + | |
- | Définir la syntaxe des expressions rationnelles des tests -regex | + | |
- | et -iregex qui seront indiqués plus loin sur la ligne de com‐ | + | |
- | mande. Les types actuellement implémentés sont emacs (type par | + | |
- | défaut), posix-awk, posix-basic, posix-egrep et posix-extended. | + | |
- | </code> | + | |
- | + | ||
- | * Syntaxe : | + | |
- | <code> | + | |
- | find -regextype "posix-extended" -regex "ERe" | + | |
- | </code> | + | |
- | + | ||
- | ====Les raccourcis ne sont pas posix==== | + | |
- | + | ||
- | * __sed__ : | + | |
^Séquences ^Séquences ^ | ^Séquences ^Séquences ^ | ||
Ligne 1432: | Ligne 1580: | ||
|**''<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 ^ | ||
Ligne 1444: | Ligne 1589: | ||
|**''<nowiki>\c </nowiki>''** | tout caractère pris sous sa forme littérale\\ excepté **''<nowiki>\</nowiki>''** | | |**''<nowiki>\c </nowiki>''** | tout caractère pris sous sa forme littérale\\ excepté **''<nowiki>\</nowiki>''** | | ||
- | __Excepté **''<nowiki>(er1)(er2)</nowiki>''**__ : | ||
- | |||
- | * Tous sont utilisables avec grep -E et egrep | ||
- | * Tous sont utilisable avec awk | ||
- | * Certains posent problème avec sed -r | ||
- | |||
- | __Options nécessaires avec find et locate__ : | ||
- | |||
- | * find -regextype "posix-extended"\\ Les types actuellement implémentés sont emacs (type par défaut), posix-awk, posix-basic, posix-egrep et posix-extended. | ||
- | |||
- | *locate --regex : Interpréter tous les "PATTERNs" (modèles) comme des expressions rationnelles étendues. | ||