Est-ce que sed \ {x, y \} est gourmand?

Je voudrais savoir si, par exemple, \{x,y\} dans sed essaiera de faire correspondre autant ou aussi peu de caractères que possible.

Aussi, quelqu'un peut-il m'expliquer le comportement inattendu de sed ?

 echo "baaab" | sed 's/a\{1,2\}//' bab echo "baaab" | sed 's/a\{0,2\}//' baaab 

Dans la première ligne, sed devient avide, dans le second apparemment, il n'y a pas de raison pour cela?

J'utilise GNU sed version 4.2.1.

a\{0,2\} correspondra à la string vide au début de la ligne (en fait, toute string vide, mais g n'a pas été spécifiée):

 $ echo "baaab" | sed 's/a\{0,2\}/y/' ybaaab 

Puisque GNU sed fait correspondre de gauche à droite et qu'un rlocation global n'est pas spécifié, seul le début de la ligne est apparié. Si vous aviez utilisé g :

 $ echo "baaab" | sed 's/a\{0,2\}/y/g' ybyyby 

Les strings vides au début et à la fin correspondent, et l' aa , et le rest a .

Oui, c'est gourmand.

Dans le système conforme POSIX, non seulement sed mais aussi tous les outils qui utilisent Basic Regular Expression , le model assorti sera toujours gourmand :

La search d'une séquence correspondante commence au début d'une string et s'arrête lorsque la première séquence correspondant à l'expression est trouvée, où «premier» est défini comme signifiant «commence le plus tôt dans la string». Si le model autorise un nombre variable de caractères correspondants et qu'il y a plus d'une telle séquence commençant à ce point, la plus longue séquence correspondante est appariée . Par exemple, le BRE "bb *" correspond aux deuxième à quasortingème caractères de la string "abbbc", et l'ERE "(wee | week) (chevaliers | nuit)" correspond aux dix caractères de la string "weeknights".

Conformément à la correspondance entière étant la plus longue des correspondances les plus à gauche, chaque sous-masque, de gauche à droite, doit correspondre à la string la plus longue possible. À cette fin, une string nulle doit être considérée comme plus longue qu'aucune correspondance . Par exemple, la sous-expression "(\ 1)" correspond à "abcdef" et correspond au BRE "(a *) *" par rapport à "bc", la sous-expression " \ 1) "est la string nulle.

Le motif a\{0,2\} correspond à n'importe quelle occurrence du caractère a entre zéro et deux. Zéro occurrence signifie la string vide, considérée comme plus longue que la correspondance indiquée ci-dessus.

Le problème avec votre utilisation est que vous n'avez pas utilisé le flag g lobal pour la command sed s ubstitution. Sans flag lobal, sed arrête de faire sa substitution dès qu'il a trouvé la première correspondance, qui est la string vide au début de la ligne.


La forme générale est \{m,n\} avec 0 <= m <= n <= RE_DUP_MAX , avec RE_DUP_MAX est 32767 dans la plupart des plateforms:

 $ getconf RE_DUP_MAX 32767