GNU awk: accessing captured groups in replacement text

霸气de小男生 提交于 2019-11-27 15:46:37

问题


This seems like it should be dirt simple, but the awk gensub/gsub/sub behavior has always been unclear to me, and now I just can't get it to do what the documentation says it should do (and what experience with a zillion other similar tools suggests should work). Specifically, I want to access "captured groups" from a regex in the replacement string. Here's what I think the awk syntax should be:

awk '{ gsub(/a(b*)c/, "Here are bees: \1"); print; }'

That should turn "abbbc" into "Here are bees: bbb". It does not, at least not for me in Ubunutu 9.04. Instead, the "\1" is rendered as a ^A; that is, the character with code 1. Not what I want, of course. How do I do this?

Thanks.


回答1:


echo abbc | awk '{ print gensub(/a(b*)c/, "Here are bees: \\1", "g", $1);}'

See manual here to see the difference between gsub and gensub




回答2:


Per the gawk manual

gensub provides an additional feature that is not available in sub or gsub: the ability to specify components of a regexp in the replacement text. This is done by using parentheses in the regexp to mark the components and then specifying ‘\N’ in the replacement text, where N is a digit from 1 to 9.

You must use gensub, you must specify "g", and you must grab the result of gensub, since it does not modify in-place.

awk '{ r = gensub(/a(b*)c/, "Here are bees: \\1", "g"); print r; }'


来源:https://stackoverflow.com/questions/1555173/gnu-awk-accessing-captured-groups-in-replacement-text

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!