8 votes

Pourquoi ce motif correspond-il à `ab`, mais pas à `ba` ?

J'ai bricolé avec globalisation étendue en bash, mais il y a une certaine bizarrerie avec le matcheur inverse !(PATTERN) . Considérons l'exemple suivant

$ touch ab ba
$ shopt -s extglob

$ echo *a*
ab ba
$ echo !(a)*a*
ab ba
$ echo *a*!(a)
ab

Maintenant, ça ressemble à !() correspond à la chaîne vide, mais pourquoi pas *a*!(a) match ba ?

J'ai supposé que dans le deuxième exemple ab est apparié comme suit

!(a) ->  ""
*    ->  ""
a    ->  "a"
*    ->  "b"

ce qui à son tour suggérerait une correspondance de ba dans le troisième cas, comme suit

*    ->  "b"
a    ->  "a"
*    ->  ""
!(a) ->  ""

mais on dirait que ça ne marche pas.

Même en considérant la cupidité, ça n'a aucun sens pour moi. Qu'est-ce que j'ai raté ?

éditer :
Je suis sur GNU bash, Version 4.1.7(2)-release (i386-apple-darwin10.4.0)

1voto

mana Points 2019

C'est en effet étrange. Je pourrais reproduire votre comportement. L'étrangeté est le * derrière le a caractère. Quand j'exécute votre code :

$ echo *a*!(a)
ab

... c'est comme vous l'avez décrit. Mais si je saute cette seconde * il correspond aux deux fichiers

$ echo *a!(a)
ab ba

Ce qui signifie que vos éléments de correspondance devraient être corrects. La question est de savoir pourquoi ce deuxième astérisque ne correspond pas à la chaîne nulle dans le premier exemple. Comme le dit la documentation, il devrait correspondre à la chaîne nulle, mais il semble que cela ne fonctionne pas correctement.

Peut-être que nos versions de bash ne correspondent pas à la documentation ?

$ bash --version
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin11)
Copyright (C) 2007 Free Software Foundation, Inc.

1voto

Nahuel Fouilleul Points 3018

Cela fonctionne : () ajouté pour désambiguïser

echo @(*a*)!(a)
echo !(a)@(*a*)

étrange : *a*!(a)c , matches abc y bac (ce qui est un comportement normal)

0voto

Pumbaa80 Points 27066

Il s'agit d'un bogue dans Bash

Chet Ramey a écrit
[...] et cela sera corrigé pour la prochaine version.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X