2015-12-08 32 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