Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format
PDF et la grise au format ODT →
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Prochaine révision Les deux révisions suivantes | ||
doc:programmation:shell:regexp [26/08/2013 12:26] smolski [REGEXP] |
doc:programmation:shell:regexp [26/08/2013 17:12] smolski [Introduction] |
||
---|---|---|---|
Ligne 36: | Ligne 36: | ||
===== Introduction ===== | ===== Introduction ===== | ||
- | Les regexp **[[manuel:bash]]** **dash** **zsh** //etc...// sont des regexp pour les noms de fichiers même. \\ | + | Les //regexp// des [[manuel:shell]] sont des règles de filtrage permettant de sélectionner des fichiers selon leur nom ou leur emplacement. \\ |
- | Elles ne sont pas transmises au programme tel quel mais remplacées par bash. | + | Ces règles ne sont pas transmises au programme tel quel mais sont remplacées par le shell utilisé. |
- | Par exemple pour cette commande [[commande:ls]]((l'option **-d** permet à **ls** de lister les répertoires sans leur contenu)): | + | Pour la commodité de ce tuto, sauf indication contraire, nous utiliserons ici le shell [[manuel:bash]]. |
+ | |||
+ | Par exemple pour cette commande [[commande:ls]] dont l'option **-d** permet à **ls** de lister uniquement les répertoires, sans leur contenu : | ||
<code bash> | <code bash> | ||
ls -d *</code> | ls -d *</code> | ||
- | C'est bash qui va **interpréter** la regexp * (étoile) et la remplacer par tout le contenu du répertoire rendu ainsi lisible pour la commande ls et son action propre sur chacun d'eux. | + | C'est bash qui va **interpréter** la regexp * (étoile) et la remplacer par tout le contenu du répertoire rendu ainsi lisible pour la commande ls et son action sur chacun d'eux. |
fichier1 fichier2 … dossier1 … | fichier1 fichier2 … dossier1 … | ||
Ligne 50: | Ligne 52: | ||
Tout d'abord, un exemple pour appréhender les notions utilisées dans cette page. \\ | Tout d'abord, un exemple pour appréhender les notions utilisées dans cette page. \\ | ||
- | Imaginons que, dans un répertoire, nous désirons sélectionner toutes les //chaînes de caractères// ((**CHAÎNE DE CARACTÈRES** : \\ | + | Imaginons que, dans un répertoire, nous désirons sélectionner toutes les //chaînes de caractères//((**CHAÎNE DE CARACTÈRES** : \\ |
- | Ce sont des caractères accolés, un mot, une phrase ou un nom de fichier. \\ | + | Les //chaîne de caractères// sont des caractères accolés, un mot, une phrase ou un nom de fichier.)) dont la rédaction contient **3 a** contigues (**aaa**). \\ |
- | )) dont la rédaction contient **3 a** contigues (**aaa**). \\ | + | Cette chaîne recherchée, formée des 3 **a** contigues (**aaa**), encadrée ou non d'autres lettres //quelconques//, se nomme __dans son ensemble__ : ''un motif''. |
- | Cette chaîne formée des 3 **a** contigues (**aaa**), encadrée par un nombre //quelconque// (éventuellement nul) de lettres //quelconques//, se nomme __dans son ensemble__ : | + | |
- | un motif | + | |
Pour décrire précisément ces **motifs** à un programme, on utilise des //expressions régulières// ou //regular expression// (ou encore un **regexp** en abrégé courant). | Pour décrire précisément ces **motifs** à un programme, on utilise des //expressions régulières// ou //regular expression// (ou encore un **regexp** en abrégé courant). | ||
Ligne 60: | Ligne 60: | ||
==== Syntaxes ==== | ==== Syntaxes ==== | ||
- | Pour ces **regexp**, __Différents programmes__ //utilisent// __différentes syntaxes__, de ce fait leur __symbolique peut être différente__ il alors faut bien distinguer le contexte où interviennent les **regexp**. \\ | + | Pour ces **regexp**, __Différents programmes__ //utilisent// __différentes syntaxes__, de ce fait leur __symbolique peut être différente__ il faut donc bien distinguer le contexte où interviennent les **regexp**. |
- | Par exemple, un **regexp** destiné à l'utilisation d'une commande **sed**, **find** **locate** ou **grep**, devra être écrit différemment dans le contexte de __l'utilisation d'une commande **bash**__ (voir : [[commande:les_metacaracteres | Bash - Les metacaractères (Pattern - Glob)]]). \\ | + | |
+ | Par exemple, un **regexp** destiné à l'utilisation d'une commande [[commande:sed]], [[manuel:find]], [[commande:locate]] ou [[commande:grep]], devra être écrit différemment dans le contexte de __l'utilisation d'une commande **bash**__ (voir : [[commande:les_metacaracteres | Bash - Les metacaractères (Pattern - Glob)]]). | ||
//Idem pour des contextes différents...// | //Idem pour des contextes différents...// | ||
- | Pour être clair dans ce wiki, nous indiquerons le terme REGEXP pour ce qui concerne le contexte //find - locate - grep - sed//. \\ | + | Pour être clair dans ce wiki, |
- | Et nous utiliserons le terme GLOB pour ce qui concerne le contexte du //bash//. | + | - nous indiquerons le terme REGEXP pour ce qui concerne le contexte //find - locate - grep - sed// |
+ | - et nous utiliserons le terme GLOB pour ce qui concerne le contexte du //bash//. | ||
==== Illustration ==== | ==== Illustration ==== | ||
- | == Dans l'utilisation de find - locate - grep - sed == | + | == Pour find - locate - grep - sed == |
+ | Ecrire : | ||
pl[oi]p | pl[oi]p | ||
Ces caractères //crochets// ''[ ]'' définissent les **regexp** concernant les chaînes de caractères ''plop plip''. | Ces caractères //crochets// ''[ ]'' définissent les **regexp** concernant les chaînes de caractères ''plop plip''. | ||
- | == Et pour bash : == | + | == Pour bash : == |
+ | Pour avoir la même expression, il faut écrire : | ||
pl{o,i}p | pl{o,i}p | ||
- | Nous voyons que dans le contexte **bash**, il faudra plutôt utiliser ces caractères //accolades// ''{}'' pour définir les **glob** concernant les mêmes chaînes de caractères ''plop plip''. | + | Nous voyons que dans le contexte **bash**, il faudra plutôt utiliser les caractères //accolades// ''{}'' pour définir les **glob** concernant les mêmes chaînes de caractères ''plop plip''. |
==== Conclusion ==== | ==== Conclusion ==== | ||
Ligne 98: | Ligne 103: | ||
Pour réaliser les TP mis en exemple dans ce tuto, il vous faut préparer ces répertoire et fichier, permettant d'accomplir les TP qui vont suivre. \\ | Pour réaliser les TP mis en exemple dans ce tuto, il vous faut préparer ces répertoire et fichier, permettant d'accomplir les TP qui vont suivre. \\ | ||
Créer le repertoire ''tuto_regexp'' dans votre ''/home/user'' : | Créer le repertoire ''tuto_regexp'' dans votre ''/home/user'' : | ||
- | + | <code bash> | |
- | $ mkdir /home/user/tuto_regexp | + | mkdir /home/user/tuto_regexp</code> |
Compléter ce répertoire avec les TP qui suivent. \\ | Compléter ce répertoire avec les TP qui suivent. \\ |