使用awk替换行中第二次出现的模式

时间:2016-03-29 14:00:25

标签: regex awk

我需要将第二次出现的模式(与最后一个字段匹配)替换为另一个模式,并保留文件中所有此类更改的计数。

示例:try.txt

np.argmax(probs, 1)

在所有具有“更改”模式的行中,我想替换最后一个单词,例如第二行中的“orange”,例如pear。请注意,不应更改第一个橙色。我还想添加一个后缀,显示文件中发生的更改次数。

我试过跟随,但它改变了两个出现的事件(第1个橙色和第2个橙色,第1个弗雷德和第2个弗雷德,第1个karly和第2个karly),而我只想改变第二次出现。

gen_nn_ops._sparse_softmax_cross_entropy_with_logits

输出结果为:

Hi

Change apple orange guava mango banana orange

It's hot outside

Change tom greg fred harry steve fred

George is a cool guy

Change mary lucy becky karly jill karly

thank you

所需的输出是:

awk 'BEGIN {cntr=0} {if (/Change/) {gsub($NF,"pear"); OFS=""; print $0,cntr; cntr++} else {print}}' try.txt

当gsub被sub替换时,它只会在第一次出现时发生变化。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

这个单行程适用于您的输入:

 awk '/Change/{$NF="peal"(i++)}7' file

这一行会覆盖OFS,但是,如果你想保持OFS(例如连续空格)不变,你可以这样做:

 awk '/Change/{sub(/\S+$/,"peal"(i++))}7' file

答案 1 :(得分:0)

我想我找到了解决办法:

awk'BEGIN {cntr = 0} {if(/ Change /){$ NF = $ NF_cntr;子($ NF, “梨”); OFS = “”; print $ 0,cntr; OFS =“”; cntr ++} else {print}}'try.txt

输出是我想要的。

但我仍希望听到社区提供更好的实现方法。

由于