忽略N个匹配后sed或awk替换

时间:2016-09-22 20:10:02

标签: bash awk replace sed

我有重复的文字,我想小心地用一个标签替换另一个标签,我不介意重复 sed awk 或其他方法。因此我想首先替换前两个匹配,然后在第一个4,6之后,我不想要 ,我只需要类似下面的代码,我想要跳过前两场比赛,然后增加这个数字。

sed 's/foo/bar/2g' fileX 
awk '{ sub(/foo/,"bar"); print }' fileX

这是一个例子。每行两次出现

blastx -q specie.fa -db pep -num 6 -max 1 -o 6 > specie.x.outfmt6
blastp -q specie.pep -db pep -num 6 -max 1 -o 6 > specie.p.outfmt6
blastx -q specie.fa -db pep -num 6 -max 1 -o 6 > specie.x.outfmt6
blastp -q specie.pep -db pep -num 6 -max 1 -o 6 > specie.p.outfmt6

期望的输出

blastx -q dog.fa -db pep -num 6 -max 1 -o 6 > dog.x.outfmt6
blastp -q dog.pep -db pep -num 6 -max 1 -o 6 > dog.p.outfmt6
blastx -q worm.fa -db pep -num 6 -max 1 -o 6 > worm.x.outfmt6
blastp -q worm.pep -db pep -num 6 -max 1 -o 6 > worm.p.outfmt6

1 个答案:

答案 0 :(得分:2)

这是你想要做的吗?

$ awk -v animals='monkey worm dog' 'BEGIN{split(animals,a)} NR%2{c++} {$NF=a[c]} 1' file
here some text -t monkey
and then do something -t monkey
here some text -t worm
and then do something -t worm
here some text -t dog
and then do something -t dog

鉴于您的新样本输入/输出可能是您想要的:

$ awk -v animals='dog worm' 'BEGIN{split(animals,a)} NR%2{c++} {gsub(/specie/,a[c])} 1' file
blastx -q dog.fa -db pep -num 6 -max 1 -o 6 > dog.x.outfmt6
blastp -q dog.pep -db pep -num 6 -max 1 -o 6 > dog.p.outfmt6
blastx -q worm.fa -db pep -num 6 -max 1 -o 6 > worm.x.outfmt6
blastp -q worm.pep -db pep -num 6 -max 1 -o 6 > worm.p.outfmt6

由于您未在示例输入/输出中包含任何正则表达式字符或反向引用字符或部分匹配情况(例如,如果单词species出现在某处且不应更改),我认为它们可以&#因为我们不需要脚本来防范它们。