Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ack with regex - Confusion with simple queries

Tags:

regex

ack

I am trying to use ack-is-better-than-grep (ack) with regular expressions to find lines and snippets in my code repository. My understanding is that ack uses Perl-derivative regular expressions, is that correct?

However, I am not sure how would these queries work:

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

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

Could they give different outputs? If so, why?

EDIT: In my tests they output different results (the first one outputs more matches than the others, for example). They also highlight different parts of the same lines.

EDIT 2: The difference in the output apparently is related to the highlighting (the coloring of the output). I have noticed that if I run ack with --nocolor the output of the commands above are the same. Apparently running ack with the default coloring makes part of the output invisible in my machine/config. I am running it on a GNOME terminal from bash in Ubuntu 11.04.

like image 703
Amelio Vazquez-Reina Avatar asked Jul 18 '11 19:07

Amelio Vazquez-Reina


1 Answers

My understanding is that ack uses Perl-derivative regular expressions, is that correct?

Yes. In fact, ack is written in Perl and just forwards the expressions to the internal engine.

Could they give different outputs? If so, why?

The expressions should find the same results. However, the output might still differ since ack allows syntax highlighting in its output (by default; unless --nocolor is specified) – it uses ANSI escape codes to colour hits in the output and obviously 'foo' will highlight up something different than '.*foo' (and the other queries).

Namely, in the following input:

This is a foo test.

a query for 'foo' will highlight just that: “foo”, while '.*foo' will highlight “This is a foo”.

like image 198
Konrad Rudolph Avatar answered Nov 08 '22 08:11

Konrad Rudolph