web-dev-qa-db-fra.com

ack regex: associer deux mots dans l'ordre dans la même ligne

Je souhaite rechercher des lignes dans des fichiers contenant deux mots, Word_1 et Word_2 dans l'ordre, comme dans Line A ci-dessous, mais pas comme dans Line B ou Line C:

Line A: ... Word_1 .... Word_2 .... 
Line B: ... Word_1 ....
Line C: ... Word_2 ....

J'ai essayé

$ack '*Word_1*Word_2'
$ack '(Word_1)+*(Word_2)+'

et les mêmes commandes avec ^ ajouté au début de l'expression régulière (pour essayer de suivre la syntaxe de l'expression régulière Perl).

Aucune de ces commandes ne renvoie les fichiers ou les lignes qui m'intéressent.

Qu'est-ce que je fais mal?

Merci!

26

Vous voulez trouver Word_1, suivi de n'importe quoi, n'importe quel nombre de fois, suivi de Word_2. Ça devrait être

Word_1.*Word_2

Vous semblez utiliser * comme il est souvent utilisé dans les recherches en ligne de commande, mais dans les expressions régulières, est-ce un quantificateur pour le caractère précédent, ce qui signifie qu'il correspond au moins 0 fois. Par exemple, l'expression régulière a* correspondrait à 0 ou plus as, alors que l'expression régulière a+ correspondrait à au moins un a.

Le métacaractère regex signifiant "correspond à tout" est ., alors .* signifie "correspond à n'importe quoi, n'importe quel nombre de fois. Voir perlrequick pour une brève introduction sur le sujet.

43
dsolimano