2010-11-19 8 views
10

Supongamos que tengo un archivo foo.txt con el siguiente contenido:¿Cómo usar los grupos regex con nombre en el resultado de ack?

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

Cuando ack para la parte de fecha con el siguiente, funciona:

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

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

Pero cuando trato de usar --output con el grupo llamado "foo", no puedo hacer que funcione:

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

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

Cualquier ayuda es muy apreciada. Muchas gracias.

+0

Nota: El uso de grupos de expresiones regulares con nombre es dependiente en su Perl subyacente. Los grupos de expresiones regulares con nombre se introdujeron en Perl 5.10, pero si usa ack con un Perl anterior (ya que ack también funciona con Perl 5.8), no funcionarán. –

Respuesta

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

(?P=foo) sólo funciona dentro la expresión regular (que es el equivalente con nombre de \1). $+{foo} es el equivalente nombrado de $1.

Además, con la mayoría de las cáscaras, las comillas simples le ayudará a evitar las barras invertidas adicionales:

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

Esa parte 'P' de' (? P ...) 'es opcional. Es decir, un simple '(? ...)' es suficiente. – tchrist

Cuestiones relacionadas