ack 3 is a greplike tool optimized for searching large code trees.
Improvements over ack 2 include:
-
Improved
-w
means more accurate searching for words. -
-w
option will warn if your pattern does not lend itself to word matching. -
-i
,-I
and--smart-case
-
--proximate=N
option -
--underline
option for showing matches without color coding. -
Added
--pod
and--markdown
. -
Added
GNUmakefile
to the list of makefile specs. -
Added
-S
as a synonym for--smart-case
. -
Added many more checks for mutually exclusive command-line options.
-
Added a filetype for SVG files.
-
Column numbers were not getting colorized in the output. Added
--color-colno
option andACK_COLOR_COLNO
environment variable. -
A pattern that wanted whitespace at the end could match the linefeed at the end of a line. This is no longer possible.
ack 2 only needed Perl 5.8.8. This shouldn't be a problem since 5.10.1 has been out since 2009.
ack 3 will not allow you to use -w
with a pattern that doesn't begin or
end with a word character.
ack 2 would highlight your capture groups. For example,
ack '(set|get)_foo_(name|id)'
would highlight the set
or get
, and the name
or id
, but not the
full set_user_id
that was matched.
This feature was too confusing and has been removed. Now, the entire matching string is highlighted.
In ack 2, you could put any kind of Perl code in the --output
option and it would get eval
uated at run time, which would let
you do tricky stuff like this gem from Mark Fowler
(http://www.perladvent.org/2014/2014-12-21.html):
ack --output='$&: @{[ eval "use LWP::Simple; 1" && length LWP::Simple::get($&) ]} bytes' \
'https?://\S+' list.txt
http://google.com/: 19529 bytes
http://metacpan.org/: 7560 bytes
http://www.perladvent.org/: 5562 bytes
This has been a security problem in the past, and so in ack 3 we
no longer eval
the contents of --output
. You're now restricted
to the following variables: $1
thru $9
, $_
, $.
, $&
, $`
,
$'
and $+
. You can also embed \t
, \n
and \r
,
and $f
as stand-in for $filename
in ack2 --output
.
The ACK_OPTIONS
variable was used to supply command line arguments to
ack invocations. This has been removed. Use an ackrc file instead.
The --lines
option let you select a specific range of lines to print, and
not match. There are other better ways to do this (sed
, for example).
The --man
option would use the external perldoc
program for displaying
documentation. However, this was causing portability problems since some
users might not have it installed. The downside is that the text rendering
is not quite as pretty.