2010-03-22 14 views
18

J'essaie de parcourir plusieurs fichiers dans des sous-répertoires imbriqués pour rechercher des correspondances d'expressions régulières; mon regex nécessite un lookbehind négatif.Quel est le moyen le plus simple d'obtenir un équivalent à grep GNU qui supporte les lookbehinds négatifs?

Perl a lookbehind négatif, mais autant que je peux dire GNU grep doesn't support negative lookbehinds.

Quelle est la manière la plus simple d'obtenir un équivalent à grep GNU qui supporte les lookbehinds négatifs?

(Je suppose que je pourrais écrire mon propre mini-grep en Perl, mais cela ne semble pas nécessaire.) Ma copie du livre de recettes Perl inclut la source de tcgrep, est-ce que je devrais utiliser? , où est la dernière version? Ne me dites pas que je dois taper tout ce programme!)

Répondre

23

Utilisez ack! Ack est écrit en Perl donc il utilise le moteur regex de Perl (par défaut).

Le look-behind négatif est ack "(?<!bad)boy" (par le commentaire de Willert)

+1

Je pensais que quelqu'un pourrait le suggérer, mais je ne pense pas que ack utilise un lookbehind négatif. Par exemple, j'ai créé un fichier temporaire dans un répertoire temporaire contenant deux lignes: "goodboy" et "badboy", puis j'ai utilisé l'exemple de Perl dans un Nutshell: 'ack" (?

+4

Le regard négatif derrière est ack "(?, s'en tirer avec le = willert

+0

Bizarre. J'ai écrit sur mon livre à la plume pour rectifier mon erreur! –

3

de Merci à un commentaire d'autres question. J'ai trouvé que lookbehind négatif est expérimentalement pris en charge dans grep avec l'option -P/--perl-regexp, donc vous pouvez toujours pas besoin d'utiliser un outil différent si vous préférez continuer à utiliser grep. À propos, mon alternative préférée à grep est grin (qui est écrit en python).