我的行具有可变数量的下划线。我需要从行尾开始替换第3个下划线。是否有sed
,awk
或任何其他oneliner选项?
示例:
>ABC_BBB_VVV_BBB_NNN
>ABC_BBB_FFF_VVV_BBB_NNN
应该变成
>ABC_BBB=VVV_BBB_NNN
>ABC_BBB_FFF=VVV_BBB_NNN
答案 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