expressions rationnelles

Le
Vincent Verdon
Bonsoir à tous,

j'ai une interrogation à laquelle je ne trouve pas vraiment de réponse.

Les expressions rationnelles permettent de créer des motifs à utiliser
avec diverses commandes Unix, mais leur utilisation dépend en fait de la
commande utilisée, sans que je comprenne la logique de la chose.
Par exemple, prenons le caractère * qui, utilisé avec ls correspond à
n'importe quelle chaîne de caractère et qui utilisée dans find /rep
-name "essai*" signifie plusieurs répétitions du caractère précédent (i
dans mon exemple).

Je sais dans quel cas je peux utiliser telle syntaxe, mais je me demande
où est la logique ?

Amicalement, Vincent Verdon
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Nicolas George
Le #20480501
Vincent Verdon wrote in message
Par exemple, prenons le caractère * qui, utilisé avec ls correspond à
n'importe quelle chaîne de caractère



Non, pas du tout. Le caractère *, utilisé avec ls, signifie le caractère *
et rien d'autre. Quand on écrit « ls * », c'est le shell qui interprète le
caractère *, ls ne le voit jamais, il est remplacé par la liste des
fichiers.

et qui utilisée dans find /rep
-name "essai*" signifie plusieurs répétitions du caractère précédent (i
dans mon exemple).



Non, ce n'est pas vrai : l'argument de find -name obéit en gros aux mêmes
règles que l'expansion de noms du shell.

Qui, soit dit en passant, ne sont pas du tout des expressions rationnelles.

Je sais dans quel cas je peux utiliser telle syntaxe, mais je me demande
où est la logique ?



La logique réside dans le fait de chercher à fournir l'interface la plus
pratique possible : les règles d'expansion de noms (glob) sont plus
pratiques pour les noms de fichiers, les expressions rationnelles sont plus
générales. Donc un programme qui traite essentiellement des noms de fichiers
aura plutôt intérêt à implémenter du glob, et un programme qui traite du
texte général aura plutôt intérêt à implémenter des expressions
rationnelles.
Vincent Verdon
Le #20485601
Bonjour,

Nicolas George a écrit :
Vincent Verdon wrote in message
Par exemple, prenons le caractère * qui, utilisé avec ls correspond à
n'importe quelle chaîne de caractère



Non, pas du tout. Le caractère *, utilisé avec ls, signifie le caractère *
et rien d'autre. Quand on écrit « ls * », c'est le shell qui interprète le
caractère *, ls ne le voit jamais, il est remplacé par la liste des
fichiers.

et qui utilisée dans find /rep
-name "essai*" signifie plusieurs répétitions du caractère précédent (i
dans mon exemple).



Non, ce n'est pas vrai : l'argument de find -name obéit en gros aux mêmes
règles que l'expansion de noms du shell.



Oups ! Je me suis trompé. Je pensais à grep en fait...


Qui, soit dit en passant, ne sont pas du tout des expressions rationnelles.

Je sais dans quel cas je peux utiliser telle syntaxe, mais je me demande
où est la logique ?



La logique réside dans le fait de chercher à fournir l'interface la plus
pratique possible : les règles d'expansion de noms (glob) sont plus
pratiques pour les noms de fichiers, les expressions rationnelles sont plus
générales. Donc un programme qui traite essentiellement des noms de fichiers
aura plutôt intérêt à implémenter du glob, et un programme qui traite du
texte général aura plutôt intérêt à implémenter des expressions
rationnelles.



Là effectivement, je comprends mieux.

Merci beaucoup pour la réponse.

Amicalement, Vincent Verdon
Cyrille Lefevre
Le #20490111
Bonjour,

pour compliquer un peu la chose, nous avons les BRE et les ERE,
BRE pour basic regular expression et REE pour extended regular expression .
regular expression se traduisant en français comme expression rationnel et non régulière !
les BRE sont urilisées pas grep, ed et sed.
les ERE par egrep et awk essentiellement.
le shell (et find) utilise, lui, des patterns, autrement dit, des express ions shell,
je ne connais pas d'autre traduction :( direction le jargon français ?

les grosses différences sont :

shell ksh BRE ERE
* * .* .*
? ? . .
[a-z] idem idem idem
+(?) .{1,} .+
?(?) .{0,1} .?
.{1,3} ?{1,3}
@(x|y) (x|y)
!(x|y)

ksh == bash + shopt -s extglob

cela sans compter sur les PCRE qui viennent de perl pour perl je sais pas quoi regular expression...
qui permettent de faire des truc vraiment barbare et incompréhensible, à la perl, quoi :-)

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Olivier Miakinen
Le #20491261
[Copie et suivi vers fr.comp.lang.regexp]

Le 04/11/2009 23:55, Cyrille Lefevre a écrit :

pour compliquer un peu la chose, nous avons les BRE et les ERE,
BRE pour basic regular expression et ERE pour extended regular expression.
regular expression se traduisant en français comme expression rationnelle et non régulière !
les BRE sont utilisées par grep, ed et sed.
les ERE par egrep et awk essentiellement.
le shell (et find) utilise, lui, des patterns, autrement dit, des expressions shell,
je ne connais pas d'autre traduction :( direction le jargon français ?

les grosses différences sont :

shell ksh BRE ERE
* * .* .*
? ? . .
[a-z] idem idem idem
+(?) .{1,} .+
?(?) .{0,1} .?
.{1,3} ?{1,3}
@(x|y) (x|y)
!(x|y)

ksh == bash + shopt -s extglob



Merci pour ce bref résumé.

cela sans compter sur les PCRE qui viennent de perl pour perl je sais pas quoi regular expression...



« perl compatible regular expression » : il s'agit d'un sur-ensemble des
expressions rationnelles de Perl 5.

qui permettent de faire des truc vraiment barbares et incompréhensibles, à la perl, quoi :-)



;-)

Je signale au passage que le JavaScript actuellement implémenté dans la
plupart des navigateurs web (ECMA-262 édition 3) utilise les expressions
rationnelles de Perl 5, alors que PHP dispose d'un ensemble de fonctions
PCRE. PHP a aussi un exemple de fonctions pour des expressions POSIX, je
crois qu'il s'agit des ERE.

Enfin, je fais suivre la discussion vers fr.comp.lang.regexp.

P.-S. : Cyrille, tes lignes sont trop longues. Tu ne t'en rends pas
compte à cause du format flowed, mais tu devrais remettre la limite à
72 caractères (ça ne changera rien pour toi mais ce sera mieux pour les
autres).

Cordialement,
--
Olivier Miakinen
Vincent Verdon
Le #20495851
Bonsoir,

et merci pour les précisions que vous apportez.

Olivier Miakinen a écrit :
[Copie et suivi vers fr.comp.lang.regexp]

Le 04/11/2009 23:55, Cyrille Lefevre a écrit :
pour compliquer un peu la chose, nous avons les BRE et les ERE,
BRE pour basic regular expression et ERE pour extended regular expression.
regular expression se traduisant en français comme expression rationnelle et non régulière !
les BRE sont utilisées par grep, ed et sed.
les ERE par egrep et awk essentiellement.





Enfin grep -E et sed -r permet d'utiliser les expressions régulières
étendues... pour simplifier encore un peu les choses !


le shell (et find) utilise, lui, des patterns, autrement dit, des expressions shell,
je ne connais pas d'autre traduction :( direction le jargon français ?

les grosses différences sont :

shell ksh BRE ERE
* * .* .*
? ? . .
[a-z] idem idem idem
+(?) .{1,} .+
?(?) .{0,1} .?
.{1,3} ?{1,3}
@(x|y) (x|y)
!(x|y)

ksh == bash + shopt -s extglob



Merci pour ce bref résumé.

cela sans compter sur les PCRE qui viennent de perl pour perl je sais pas quoi regular expression...



« perl compatible regular expression » : il s'agit d'un sur-ensemble des
expressions rationnelles de Perl 5.

qui permettent de faire des truc vraiment barbares et incompréhensibles, à la perl, quoi :-)



;-)

Je signale au passage que le JavaScript actuellement implémenté dans la
plupart des navigateurs web (ECMA-262 édition 3) utilise les expressions
rationnelles de Perl 5, alors que PHP dispose d'un ensemble de fonctions
PCRE. PHP a aussi un exemple de fonctions pour des expressions POSIX, je
crois qu'il s'agit des ERE.

Enfin, je fais suivre la discussion vers fr.comp.lang.regexp.

P.-S. : Cyrille, tes lignes sont trop longues. Tu ne t'en rends pas
compte à cause du format flowed, mais tu devrais remettre la limite à
72 caractères (ça ne changera rien pour toi mais ce sera mieux pour les
autres).

Cordialement,



Amicalement, Vincent Verdon
Cyrille Lefevre
Le #20525311
Vincent Verdon a écrit :

Enfin grep -E et sed -r permet d'utiliser les expressions régulière s
étendues... pour simplifier encore un peu les choses !



egrep == grep -E, ce dernier ne marche pas sur tous les OS, alors
qu'egrep oui.
sinon, s/sed/GNU &/

P.-S. : Cyrille, tes lignes sont trop longues. Tu ne t'en rends pas





j'vais voir ça...

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Nicolas George
Le #20525521
Cyrille Lefevre wrote in message
egrep == grep -E, ce dernier ne marche pas sur tous les OS, alors
qu'egrep oui.



grep -E est standard ; egrep ne l'est plus.
naddy
Le #20531061
Nicolas George
> egrep == grep -E, ce dernier ne marche pas sur tous les OS, alors
> qu'egrep oui.

grep -E est standard ; egrep ne l'est plus.



grep -E est une invention de POSIX. egrep existe depuis une trentaine
d'années.

--
Christian "naddy" Weisgerber
Stephane CHAZELAS
Le #20532601
2009-11-04, 23:55(+01), Cyrille Lefevre:
[...]
les grosses différences sont :

shell ksh BRE ERE
* * .* .*
? ? . .
[a-z] idem idem idem
+(?) .{1,} .+
?(?) .{0,1} .?
.{1,3} ?{1,3}
@(x|y) (x|y)
!(x|y)




ksh == bash + shopt -s extglob



C'est un peu raccourci. Le ksh above, c'est ksh88 ou pdksh,
ksh93 en supporte des nouveaux. Et c'est oublier zsh.

zsh a l'option kshglob pour les patterns ksh et extendedglob
pour ses patterns etendus.

fnmatch ksh88 ksh93t zsh BRE ERE Perl
* * * * .* .* .*
? ? ? ? . . .
[a-z] idem idem idem idem idem idem
+(?) +(?) ?## .{1,} .+ .+
?(?) ?(?) (?|) .{0,1} .? .?
{1,3}(?) .{1,3} .{1,3} .{1,3}
@(x|y) @(x|y) (x|y) (x|y) (x|y)
!(x|y) !(x|y) ^(x|y) (?!x|y)
(x but not y) x~y (?!y)x
(nested pair match) %({}Q"E) possible
(non-greedy) ~(-g:*) ?# .*?
(decimal number match) <1-12>
(case insensitive) ~(i:a) (#i)a (?i:a)
(2 errors allowed) (#a2)xxxx

ksh reconnait aussi plusieurs formes de regexps (dont son
implementation de pcre) et zsh supporte des "globbing
qualifiers" qui permettent de selectionner des fichiers selon
d'autres attributs que le nom (taille, date de modification,
type...) et les pcre par un module.

Comme toujours pour ksh, la doc est incomplete et difficile a
trouver.

cela sans compter sur les PCRE qui viennent de perl pour perl
je sais pas quoi regular expression... qui permettent de faire
des truc vraiment barbare et incompréhensible, à la perl, quoi
:-)



???

Les regexp perl (ou à la perl) ont tendance a devenir la norme
de nos jours (ruby, ksh, php, TCL...)

--
Stéphane
Cyrille Lefevre
Le #20533871
Christian Weisgerber a écrit :
Nicolas George
egrep == grep -E, ce dernier ne marche pas sur tous les OS, alors
qu'egrep oui.


grep -E est standard ; egrep ne l'est plus.



grep -E est une invention de POSIX. egrep existe depuis une trentaine
d'années.




tu me l'enlèves du clavier :-)

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
Publicité
Poster une réponse
Anonyme