2010-11-19 3 views
10

nehme ich eine foo.txt-Datei mit dem folgenden Inhalt haben:Wie benannte Regex-Gruppen in der Ack-Ausgabe verwendet werden?

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

Als ich ack für den Datumsteil mit folgenden es funktioniert:

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

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

Aber wenn ich versuche --output zu verwenden mit der genannten gruppe "foo", kann ich es nicht zur arbeit:

Jede hilfe ist sehr zu schätzen es. Vielen Dank.

+0

Hinweis: Namen verwenden regex Gruppen auf Ihrem zugrunde liegenden Perl abhängig ist. Benannte Regex-Gruppen wurden in Perl 5.10 eingeführt, aber wenn Sie ack mit einem älteren Perl verwenden (da ack auch mit Perl 5.8 funktioniert), funktionieren sie nicht. –

Antwort

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

(?P=foo) funktioniert nur innerhalb der reguläre Ausdruck (es ist das benannte Äquivalent \1). $+{foo} ist das benannte Äquivalent von $1.

Auch mit den meisten Muscheln, werden einfache Anführungszeichen helfen Sie zusätzliche Schrägstriche zu vermeiden:

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

Dieser 'P' Teil von' (? P ...) 'ist optional. Das heißt, eine einfache '(? ...)' ist reichlich. – tchrist