2010-11-19 40 views
10

假设我有以下内容的foo.txt的文件:如何在ack输出中使用命名的正则表达式组?

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

当我ack使用以下日期部分,它的工作原理:

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

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

但是当我尝试使用--output与命名组“富”,我无法得到它的工作:

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

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

任何帮助是非常感谢它。非常感谢。

+0

注意:使用正则表达式命名的组是依赖于你的底层Perl的。命名的正则表达式组是在Perl 5.10中引入的,但是如果您使用的是旧版Perl(因为ack与Perl 5.8一起工作),那么它们将不起作用。 – 2012-04-30 11:40:27

回答

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

(?P=foo)只能正则表达式(它是\1命名当量)。 $+{foo}$1的命名等价物。

而且,与大多数弹,单引号将帮助您避免额外的反斜杠:

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

'(P P ...)'的'P'部分是可选的。也就是说,一个简单的'(? ...)'很多。 – tchrist 2010-11-19 11:56:06

相关问题