2009-10-12 79 views
22

這似乎應該是污垢簡單,但AWK gensub/GSUB /子的行爲一直是我不清楚,現在我只是不能得到它做什麼文檔說它應該這樣做(以及其他幾十種類似工具的經驗表明應該起作用)。具體來說,我想從替換字符串中的正則表達式中訪問「捕獲的組」。這是我認爲awk語法應該是:GNU AWK:訪問捕獲組替換文本

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

這應該將「abbbc」變成「Here are bees:bbb」。它不,至少不適合我在Ubunutu 9.04。相反,「\ 1」呈現爲^ A;即代碼爲1的字符。當然,不是我想要的。我該怎麼做呢?

謝謝。

回答

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

參見手冊here看GSUB和gensub

+3

此外,不僅gsub和gensub在返回值方面表現不同,而且整個\ 1到\ 9特性*僅適用於gensub。 – Pointy 2009-10-12 16:05:43

+0

嘗試'回聲xxxabbcxxx' - awk的「解決方案」打破 – 2011-06-23 10:45:29

+0

@Alesandr,隨意提出一個新的 – 2011-06-27 07:29:34

19

每GAWK手冊

gensub提供了附加的特徵 不在子或GSUB可用的區別: 的能力在替換文本中指定 正則表達式的組件。這 通過使用括號中 正則表達式以標記部件和做過然後 指定「\ N」在替換 文本,其中N是從1至9

必須使用gensub數字,您必須指定「g」,並且您必須獲取gensub的結果,因爲它不會原地修改。

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