如何用awk替换第N个匹配

时间:2015-12-08 17:26:59

标签: awk gawk

sed中,您可以使用/Nsolved so long ago)替换第N个匹配:

$ sed 's/you/ME/1' <<< "hello you are you"  # 1 is superfluous here, though
hello ME are you
$ sed 's/you/ME/2' <<< "hello you are you"
hello you are ME

我试图在awk中完成相同的工作,我找到的唯一肮脏的方法是循环遍历元素并保持计数器。

即使是匹配为完整字段的更简单的情况,也会有点脏:

$ awk '{for (i=1;i<=NF;i++) if ($i=="you" && ++c==2) $i="ME"}1' <<< "hello you are you"
hello you are ME

因此,我想知道gensub()gsub()sub()函数是否允许您以更直接的方式提供此类参数。在GNU awk手册中查看String functions并没有帮助我找到它。

1 个答案:

答案 0 :(得分:3)

尝试使用gensub()。我认为它只包含在版本中,但它接受正则表达式来匹配,替换文本和位置:

awk '$0 = gensub(/you/, "ME", 1)' <<< "hello you are you"

产生:

hello ME are you

awk '$0 = gensub(/you/, "ME", 2)' <<< "hello you are you"

产生:

hello you are ME