Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

expressions rationnelles

11 réponses
Avatar
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

10 réponses

1 2
Avatar
Nicolas George
Vincent Verdon wrote in message
<4af09506$0$7791$:
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.
Avatar
Vincent Verdon
Bonjour,

Nicolas George a écrit :
Vincent Verdon wrote in message
<4af09506$0$7791$:
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
Avatar
Cyrille Lefevre
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.
Avatar
Olivier Miakinen
[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
Avatar
Vincent Verdon
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
Avatar
Cyrille Lefevre
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.
Avatar
Nicolas George
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.
Avatar
naddy
Nicolas George <nicolas$ wrote:

> 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
Avatar
Stephane CHAZELAS
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
Avatar
Cyrille Lefevre
Christian Weisgerber a écrit :
Nicolas George <nicolas$ wrote:

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.
1 2