【问题标题】:Command line, multi-line search and replace命令行、多行查找替换
【发布时间】:2014-04-28 16:59:26
【问题描述】:

在 Riak app.config 文件中有一个部分如下所示:

%% JMX Config
  {riak_jmx, [
     {enabled, false}
  ]},

我想用它来代替:

%% JMX Config
  {riak_jmx, [
     {enabled, true}
  ]},

是的,很简单,但我一直希望能够做到这一点,多行文本替换。我想使用 AWK 或 Sed 来执行操作。

(值得一提的是,我使用的是 OSX,所以我没有这些程序的精美 GNU 版本)。

我得到的最接近的是以下,它并不能正常工作......

 sed '/{riak_jmx/,/]},/{ c\
     \{riak_jmx, [\
         \{enabled, false\}

     ;   }' ./app.config

还有:

awk '/{riak_jmx/,/]},/{ if($0  ~ "{enabled, false}") {
      print "{enabled, true}" }
     else {
       print $0
     } }1' < ./app.config

这也不起作用。这两个命令都打印块的旧版本和新版本。

有什么想法吗?

【问题讨论】:

    标签: awk sed multiline command-line-interface


    【解决方案1】:

    尝试使用 sed 的 s 命令:

    sed '/{riak_jmx/,/]},/{ s/enabled, false/enabled, true/;}' ./app.config
    

    【讨论】:

    • 可以缩短一些:sed '/{riak_jmx/,/]},/{ s/false/true/;}'
    【解决方案2】:

    使用awk 你可以做到:

    awk '/riak_jmx/,/]/ {sub(/false/,"true")}1' app.config
    %% JMX Config
      {riak_jmx, [
         {enabled, true}
      ]},
    

    【讨论】:

      【解决方案3】:
      awk '/{riak_jmx, \[/ {print; getline; if($0 ~ /{enabled, false}/) sub(/false/,"true")}{print}' app.config
      

      输出:

      %% JMX Config
        {riak_jmx, [
           {enabled, true}
        ]}
      

      【讨论】:

        猜你喜欢
        • 2018-06-25
        • 2013-02-09
        • 1970-01-01
        • 2022-01-09
        • 2011-07-27
        • 2017-03-21
        • 2015-09-19
        • 1970-01-01
        • 2012-03-29
        相关资源
        最近更新 更多