2011-07-18 8 views
8

Estoy tratando de usar ack-is-better-than-grep (ack) con expresiones regulares para buscar líneas y fragmentos en mi repositorio de código. Tengo entendido que ack usa Perl-derivative regular expressions, ¿es correcto?Ack with regex - Confusión con consultas simples

Sin embargo, no estoy seguro de cómo serían estas consultas trabajar:

ack 'foo' 
ack '.*(foo)+.*' 

ack '.*foo' 
ack 'foo.*' 

Podrían dar diferentes salidas? Si es así, ¿por qué?

EDIT: En mis pruebas arrojan resultados diferentes (el primero produce más coincidencias que los otros, por ejemplo). También resaltan diferentes partes de las mismas líneas.

EDIT 2: La diferencia en la salida aparentemente está relacionada con el resaltado (la coloración de la salida). Me he dado cuenta de que si ejecuto ack con --nocolor, la salida de los comandos anteriores es la misma. Al parecer, ejecutar ack con el color predeterminado hace que parte de la salida sea invisible en mi máquina/configuración. Lo estoy ejecutando en una terminal de GNOME desde bash en Ubuntu 11.04.

+0

* ¿* estas consultas dan salidas diferentes? Si es así, ¿puedes dar un ejemplo? De lo contrario, ¿cuál es la razón para sospechar que lo hacen? –

+0

¿A qué te refieres con el primero que produce más coincidencias? ¿Qué líneas se corresponden con 1 pero no coinciden con las demás? – NorthGuard

+0

Gracias @Konrad y @inTide, he actualizado la pregunta para abordar sus comentarios. –

Respuesta

10

Según entiendo, ack usa expresiones regulares derivadas de Perl, ¿es correcto?

Sí. De hecho, ack es escrito en Perl y simplemente reenvía las expresiones al motor interno.

¿Podrían dar diferentes salidas? Si es así, ¿por qué?

Las expresiones deben encontrar los mismos resultados. Sin embargo, la salida aún puede diferir ya que ack permite resaltar la sintaxis en su salida (de manera predeterminada; a menos que se especifique --nocolor) - usa códigos de escape ANSI para colorear hits en la salida y obviamente 'foo' resaltará algo diferente a '.*foo' (y el otro consultas).

A saber, en la siguiente entrada:

This is a foo test. 

una consulta para 'foo' destacará sólo eso: “foo”, mientras que '.*foo' pondrá de relieve “This is a foo”.

+0

Gracias @Konrad, eso explica las diferencias en el resaltado. Sin embargo, obtengo salidas diferentes para ellos, PERO cuando los ejecuto con la opción '--nocolor' producen el mismo resultado. Creo que el problema es que hay un problema con los códigos de escape de ANSI en algunos de los resultados que hacen que los emparejamientos sean invisibles (hay espacio negro en la salida para algunos de ellos) –

Cuestiones relacionadas