【问题标题】:Replace nth string from each line starting from the end从末尾开始替换每行的第 n 个字符串
【发布时间】:2016-02-06 22:34:15
【问题描述】:

我有一些下划线数量不定的行。我需要从行尾开始替换第三个下划线。是否有 sedawk 或任何其他 oneliner 选项?

例子:

>ABC_BBB_VVV_BBB_NNN
>ABC_BBB_FFF_VVV_BBB_NNN

应该变成

>ABC_BBB=VVV_BBB_NNN
>ABC_BBB_FFF=VVV_BBB_NNN

【问题讨论】:

标签: replace awk sed


【解决方案1】:

这会查找倒数第三个_ 并将其替换为=

$ 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】:

    假设您希望能够将解决方案调整为 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 条件保护?
    • 如果有可能发生的话,有很多可能性要处理,但由于 OP 没有在他们的示例输入/输出中显示它......
    【解决方案3】:

    或 awk:

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

    【讨论】:

      【解决方案4】:
      awk '{sub(/_VVV/,"=VVV")}1' file
      
      >ABC_BBB=VVV_BBB_NNN
      >ABC_BBB_FFF=VVV_BBB_NNN
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-06
        • 2017-08-02
        • 2014-04-29
        • 2017-12-01
        相关资源
        最近更新 更多