【发布时间】:2016-02-06 22:34:15
【问题描述】:
我有一些下划线数量不定的行。我需要从行尾开始替换第三个下划线。是否有 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
【问题讨论】:
我有一些下划线数量不定的行。我需要从行尾开始替换第三个下划线。是否有 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
【问题讨论】:
这会查找倒数第三个_ 并将其替换为=:
$ 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。
【讨论】:
假设您希望能够将解决方案调整为 2 或 4 或任何其他数量的下划线,并使用 GNU awk 进行 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
【讨论】:
NF>n 条件保护?
或 awk:
awk -F_ '{for(i=1;i<NF;++i)printf("%s%c",$i,i==NF-3?"=":"_");printf("%s\n",$NF)}'
【讨论】:
awk '{sub(/_VVV/,"=VVV")}1' file
>ABC_BBB=VVV_BBB_NNN
>ABC_BBB_FFF=VVV_BBB_NNN
【讨论】: