16 votes

Grep : L'astérisque (*) ne fonctionne pas toujours

Si je grep un document qui contient le texte suivant :

ThisExampleString

...pour l'expression This*String o *String rien n'est renvoyé. Cependant, This* renvoie la ligne ci-dessus comme prévu.

Le fait que l'expression soit entre guillemets ne fait aucune différence.

Je croyais que l'astérisque indiquait un nombre quelconque de caractères inconnus ? Pourquoi cela ne fonctionne-t-il que s'il se trouve au début de l'expression ? Si c'est le comportement souhaité, que dois-je utiliser à la place des expressions This*String y *String ?

24voto

Sergiy Kolodyazhnyy Points 97292

Un astérisque dans expressions régulières signifie "faire correspondre l'élément précédent 0 fois ou plus".

Dans votre cas particulier avec grep 'This*String' file.txt vous essayez de dire, "hey, grep, trouve-moi le mot Thi suivi d'une minuscule s zéro ou plusieurs fois, suivi du mot String ". Les minuscules s ne se trouve nulle part dans Example donc grep ignore ThisExampleString .

Dans le cas de grep '*String' file.txt vous êtes en train de dire "grep, fais-moi correspondre la chaîne vide - littéralement rien - qui précède le mot". String ". Bien sûr, ce n'est pas ainsi que ThisExampleString est censé être lu. (Il existe autres significations possibles --Vous pouvez essayer avec et sans l'option -E mais aucune de ces significations ne ressemble à ce que vous voulez vraiment ici).

Sachant que . signifie "tout caractère unique", nous pourrions faire ceci : grep 'This.*String' file.txt . Maintenant la commande grep le lira correctement : This suivi de n'importe quel caractère (pensez-y comme à une sélection de caractères ASCII) répété un nombre quelconque de fois, suivi par String .

9voto

ieplugin Points 216

Le site * métacaractère dans BRE 1 s, ERE 1 et PCRE 1 correspond à 0 ou plusieurs occurrences du motif groupé précédent (si un motif groupé précède la balise * ), 0 ou plusieurs occurrences de la classe de caractères précédente (si une classe de caractères précède le métacaractère * ) ou 0 occurrence ou plus du caractère précédent (si ni un motif groupé ni une classe de caractères ne précède le métacaractère * métacaractère) ;

Cela signifie que dans le This*String étant le * qui n'est pas précédé d'un motif groupé ou d'une classe de caractères, le métacaractère * correspond à 0 ou plusieurs occurrences du caractère précédent (dans ce cas, le caractère s caractère) :

% cat infile               
ThisExampleString
ThisString
ThissString
% grep 'This*String' infile
ThisString
ThissString

Pour faire correspondre 0 ou plusieurs occurrences de n'importe quel caractère, vous voulez faire correspondre 0 ou plusieurs occurrences de la balise . métacaractère, qui correspond à n'importe quel caractère :

% cat infile               
ThisExampleString
% grep 'This.*String' infile
ThisExampleString

Le site * dans les BRE et ERE est toujours "gourmand", c'est-à-dire qu'il correspondra à la correspondance la plus longue :

% cat infile
ThisExampleStringIsAString
% grep -o 'This.*String' infile
ThisExampleStringIsAString

Ce n'est peut-être pas le comportement souhaité ; dans le cas contraire, vous pouvez activer l'option grep du moteur PCRE (en utilisant l'option -P ) et ajouter l'option ? qui, lorsqu'il est placé après le métacaractère * y + Les métacaractères ont pour effet de modifier leur gourmandise :

% cat infile
ThisExampleStringIsAString
% grep -Po 'This.*?String' infile
ThisExampleString

1 : Expressions régulières de base, Expressions régulières étendues et Expressions régulières compatibles avec Perl

5voto

Ova Points 456

Une des explications se trouve ici lien :

Astérisque " * "Il s'agit d'un modificateur qui s'applique au caractère unique précédent, ou à une expression telle que [0-9]. Un astérisque correspond à zéro ou plus de ce qui le précède. Ainsi, [A-Z]* correspond à un nombre quelconque de lettres majuscules, y compris aucune, alors que [A-Z][A-Z]* correspond à une ou plusieurs lettres majuscules.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X