问题
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.
回答1:
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;
}
来源:https://stackoverflow.com/questions/10253616/any-way-to-access-the-matched-groups-in-action