GNU awk: доступ к захваченным группам в тексте замены

Кажется, что это должно быть грязно, но поведение awk gensub/gsub/sub всегда было неясным для меня, и теперь я просто не могу заставить его делать то, что документация говорит о том, что он должен делать (и какой опыт с миллионом других подобных инструментов предложения должны работать). В частности, я хочу получить доступ к "захваченным группам" из регулярного выражения в заменяющей строке. Здесь я думаю, что синтаксис awk должен быть:

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

Это должно превратить "abbbc" в "Вот пчелы: bbb". Это не так, по крайней мере, не для меня в Убунуту 9.04. Вместо этого "\ 1" отображается как ^ A; то есть персонаж с кодом 1. Не то, что я хочу, конечно. Как это сделать?

Спасибо.

Ответ 1

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

См. руководство здесь, чтобы увидеть разницу между gsub и gensub

Ответ 2

В руководстве gawk

gensub предоставляет дополнительную функцию который недоступен в sub или gsub: способность указывать компоненты regexp в заменяющем тексте. Эта выполняется с помощью круглых скобок в regexp для маркировки компонентов, а затем указав '\n в замене текст, где N - цифра от 1 до 9.

Вы должны использовать gensub, вы должны указать "g", и вы должны захватить результат gensub, так как он не изменяет на месте.

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