【问题标题】:Conditional find and replace有条件的查找和替换
【发布时间】:2020-12-22 04:04:02
【问题描述】:

我正在尝试在多个文件中执行条件查找和替换。文件的内容可能是,

$value$plusargs("DEC_ARG=%0d", val1);
$value$plusargs("HEX_ARG=%h", val2);
$value$plusargs("STRING_ARG=%s", val3);

在这里,如果有%0d,我想将$value$plusargs 替换为get_dvalue_args,如果有%h,则替换为get_hvalue_args 等等..

期望的输出是,

get_dvalue_arg("DEC_ARG", val1);
get_hvalue_arg("HEX_ARG", val2);
get_svalue_arg("STRING_ARG", val3);

我尝试了下面的“awk”命令,但它用 get_dvalue_arg 替换了所有行,

awk '/=%0d/&&/$plusargs/{sub("$value$plusargs","get_dvalue_args")}1'

我也尝试了下面的“sed”命令,但结果相同,

sed -i '/=%0d/{s/$value$plusargs/get_dvalue_args/}'

请注意,我可以通过 vim 录制来做到这一点,但是我必须一个一个地修改每个文件,我正在寻找一种更好的方法来一次性完成,针对多个文件

【问题讨论】:

    标签: python perl sed replace


    【解决方案1】:

    使用具有-E 选项的 sed 来启用 ERE,例如GNU 或 OSX/BSD sed:

    $ sed -E 's/\$(value)\$plus(args\("[^=]+)=%0?(.)/get_\3\1_\2/' file
    get_dvalue_args("DEC_ARG", val1);
    get_hvalue_args("HEX_ARG", val2);
    get_svalue_args("STRING_ARG", val3);
    

    使用任何 POSIX sed:

    $ sed 's/\$\(value\)\$plus\(args("[^=]\{1,\}\)=%0\{0,1\}\(.\)/get_\3\1_\2/' file
    get_dvalue_args("DEC_ARG", val1);
    get_hvalue_args("HEX_ARG", val2);
    get_svalue_args("STRING_ARG", val3);
    

    【讨论】:

      【解决方案2】:

      Perl 单行器

      perl -pne "s/\$value\$plusargs(\(\"[A-Z_]+)=%\d?([a-z])/get_$2value_arg$1/;" data_file
      

      输入

      $value$plusargs("DEC_ARG=%0d", val1);
      $value$plusargs("HEX_ARG=%h", val2);
      $value$plusargs("STRING_ARG=%s", val3);
      

      输出

      get_dvalue_arg("DEC_ARG", val1);
      get_hvalue_arg("HEX_ARG", val2);
      get_svalue_arg("STRING_ARG", val3);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-03-17
        • 1970-01-01
        • 2015-11-30
        • 2019-01-23
        • 1970-01-01
        • 2020-04-03
        相关资源
        最近更新 更多