从结尾开始替换每行中的第n个字符串

时间:2015-11-05 22:02:14

标签: replace awk sed

我的行具有可变数量的下划线。我需要从行尾开始替换第3个下划线。是否有sedawk或任何其他oneliner选项?

示例:

>ABC_BBB_VVV_BBB_NNN
>ABC_BBB_FFF_VVV_BBB_NNN

应该变成

>ABC_BBB=VVV_BBB_NNN
>ABC_BBB_FFF=VVV_BBB_NNN

4 个答案:

答案 0 :(得分:2)

这会从最后查找第三个_并将其替换为=

$ sed -E 's/_([^_]*_[^_]*_[^_]*)$/=\1/' input
ABC_BBB=VVV_BBB_NNN    
ABC_BBB_FFF=VVV_BBB_NNN

这可以略微缩短为:

sed -E 's/_([^_]*(_[^_]*){2})$/=\1/' input

上述内容适用于n=3。对于其他n,只需将2替换为n-1

答案 1 :(得分:0)

假设您希望能够将解决方案从两端调整为2或4或任何其他数量的下划线,并使用GNU awk for gensub():

$ awk -F_ '{$0=gensub(FS,"=",NF-3)}1' file
ABC_BBB=VVV_BBB_NNN
ABC_BBB_FFF=VVV_BBB_NNN

$ awk -F_ '{$0=gensub(FS,"=",NF-2)}1' file
ABC_BBB_VVV=BBB_NNN
ABC_BBB_FFF_VVV=BBB_NNN

$ awk -F_ '{$0=gensub(FS,"=",NF-4)}1' file
ABC=BBB_VVV_BBB_NNN
ABC_BBB=FFF_VVV_BBB_NNN

答案 2 :(得分:0)

或者awk:

awk -F_ '{for(i=1;i<NF;++i)printf("%s%c",$i,i==NF-3?"=":"_");printf("%s\n",$NF)}'

答案 3 :(得分:0)

awk '{sub(/_VVV/,"=VVV")}1' file

>ABC_BBB=VVV_BBB_NNN
>ABC_BBB_FFF=VVV_BBB_NNN