在sed
中,您可以使用/N
(solved 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并没有帮助我找到它。
答案 0 :(得分:3)
尝试使用gensub()
。我认为它只包含在gawk版本中,但它接受正则表达式来匹配,替换文本和位置:
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