8

I often find myself doing the same match in the action as the pattern, to access some part of the input record, e.g.

/^Compiled from \"(.*)\"$/ {
    file_name = gensub("^Compiled from \"(.*)\"$", "\\1", "g");
    print file_name;
}

So the regexp matching is done twice. Is there any way I can access \\1 in the action without matching again?

I am trying to both reduce on pattert matching and extra code.

Joshua Goldberg
  • 5,059
  • 2
  • 34
  • 39
Miserable Variable
  • 28,432
  • 15
  • 72
  • 133
  • seems like answered here: http://stackoverflow.com/questions/2957684/awk-access-captured-group-from-line-pattern – Slartibartfast Apr 20 '12 at 21:17
  • @Slartibartfast it helps. I did not find that question before posting, so thanks. Still, as per [this](http://stackoverflow.com/a/4673336/18573) answer I have to use the `match($0....` which is kind of ugly though not really – Miserable Variable Apr 20 '12 at 21:25

1 Answers1

11

Unfortunately, GAWK, doesn't have the carry-forward feature of sed which uses an empty //.

sed '/\(patt\)ern/ {s//new\1/}' inputfile

However, you can rejoice since variables have recently been invented and they can be used for just this purpose!

BEGIN {
    pattern = "^Compiled from \"(.*)\"$"
}
$0 ~ pattern {
    file_name = gensub(pattern, "\\1", "");
    print file_name;
}
Dennis Williamson
  • 346,391
  • 90
  • 374
  • 439