2011-05-31 5 views
6

Est-il possible (et comment) de chaîner des patterns avec ack (ack-grep sur certaines distributions de Linux) comme je suis habitué avec grep?Plusieurs modèles avec ack-grep?

par exemple.

grep "foo" somefile.c | grep -v "bar" 

... pour faire correspondre toutes les lignes avec "foo" mais sans "barre".

Répondre

10

ack utilise des expressions régulières Perl, et ceux qui permettent lookahead assertions:

^(?!.*bar).*foo.*$ 

va correspondre à une ligne qui contient foo mais ne contient pas bar.

Je ne suis pas au courant de l'utilisation de ack, mais quelque chose comme cela devrait fonctionner:

ack '^(?!.*bar).*foo.*$' myfile 
+0

Le problème avec ceci est si le fichier n'a pas 'bar' en elle, la recherche de' foo 'n'est même pas essayé. –

+0

@AnthonyHatzopoulos: Pourquoi cela serait-il un problème? –

+0

OP recherche des lignes avec foo. Et puis ils ne veulent pas retourner ces lignes avec une barre sur eux. Je pense qu'il s'est juste produit que le fichier était barré, qu'ils avaient ce qu'ils voulaient. Bien qu'il ne retournera pas les fichiers avec seulement foo. Dire que je cherche tout 'foo()' mais pas 'foo (bar)', je veux toujours tous mes autres * foos *. Dans mon cas 'somefile.c' est un projet entier. Juste si cela valait la peine d'être mentionné. –