2015-12-08 29 views
2

更換第n個比賽以線在sed可以替換使用/Nsolved so long ago)第N比賽:如何使用awk

$ 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沒有顯示幫助我找到它。

回答

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 
+1

Ooooh我試過這個,但我不記得'gensub()不能代替'$ 0',但輸出它。也就是說,'awk'gensub(/ you /,「ME」,2)''對我來說不起作用,因爲它正在打印原始值。很好,非常感謝! – fedorqui