15

Suppose I have a foo.txt file with the following content:

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

When I ack for the date portion with the following, it works:

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

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

But when I try to use --output with the named group "foo", I cannot get it to work:

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

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

Any help is greatly appreciate it. Thanks so much.

Stephen Chu
  • 153
  • 1
  • 4
  • Note: Using named regex groups is dependent on your underlying Perl. Named regex groups were introduced in Perl 5.10, but if you're using ack with an older Perl (since ack works with Perl 5.8, too), then they won't work. – Andy Lester Apr 30 '12 at 11:40

1 Answers1

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

(?P=foo) only works inside the regular expression (it's the named equivalent of \1). $+{foo} is the named equivalent of $1.

Also, with most shells, single quotes will help you avoid extra backslashes:

ack '(?P<foo>\d{4}-\d{2}-\d{2})' foo.txt --output '$+{foo}'
cjm
  • 61,471
  • 9
  • 126
  • 175
  • 4
    That `P` part of `(?P…)` is optional. That is, a simple `(?…)` is plenty. – tchrist Nov 19 '10 at 11:56
  • Note: This answer does not work as of at least 2019. See https://github.com/beyondgrep/ack3/issues/284. – hftf Mar 14 '23 at 03:21