2010-11-19 4 views
10

Supposons que j'ai un fichier foo.txt avec le contenu suivant:Comment utiliser les groupes regex nommés dans la sortie ack?

[2010-11-13 12:00:02,656] 
[2010-11-13 12:00:02,701] 
[2010-11-13 12:00:02,902] 

Quand je ack pour la partie jour avec ce qui suit, il fonctionne:

ack "(?P<foo>\d{4}-\d{2}-\d{2})" foo.txt --output "\$1" 

2010-11-13 
2010-11-13 
2010-11-13 

Mais quand je tente d'utiliser --output avec le groupe nommé "foo", je ne peux pas le faire fonctionner:

ack "(?P<foo>\d{4}-\d{2}-\d{2})" foo.txt --output "(?P=foo)" 

(?=foo) 
(?=foo) 
(?=foo) 

Toute aide est grandement apprécie. Merci beaucoup.

+0

Note: L'utilisation de groupes de regex nommés dépend de votre Perl sous-jacent. Les groupes regex nommés ont été introduits dans Perl 5.10, mais si vous utilisez ack avec un Perl plus ancien (puisque ack fonctionne aussi avec Perl 5.8), ils ne fonctionneront pas. –

Répondre

16
ack "(?P<foo>\d{4}-\d{2}-\d{2})" foo.txt --output "\$+{foo}" 

(?P=foo) ne fonctionne que dans l'expression régulière (il est l'équivalent du nom de \1). $+{foo} est l'équivalent nommé de $1.

En outre, avec la plupart des coquilles, des guillemets simples vous aideront à éviter antislashs supplémentaires:

ack '(?P<foo>\d{4}-\d{2}-\d{2})' foo.txt --output '$+{foo}' 
+4

Cette partie «P» de '(? P ...)' est facultative. C'est, un simple '(? ...)' est plein. – tchrist

Questions connexes