【问题标题】:Grep between two patterns in code在代码中的两个模式之间进行 Grep
【发布时间】:2016-07-05 18:27:28
【问题描述】:

我有一个看起来像这样的模式。

var a ; 
var b;

var obj = {
aa : 'This is what I want'
};

我想要aa : ''};之间的文本

这种情况可能会多次出现,但我想要第一次。

我尝试过 awk 、 grep 和 sed。但是他们都没有给我完美的结果,而是吐出了整个代码。

到目前为止我所尝试的:

grep -Po "aa : \K.*(?= \'};)"
sed -e 's/aa :\(.*\)\n};/\1/'

【问题讨论】:

    标签: bash awk sed grep


    【解决方案1】:
    awk -F"'" -v RS=";" '/\naa/{print $2;exit}'
    

    【讨论】:

    • 它不起作用。请在aa : 'This is what I want';} 之间添加一行,然后重试
    【解决方案2】:

    请尝试以下方法:

    awk 'BEGIN {Found = 0;} /^aa :/{Found = 1; } /^};/{Found = 0;} {if(Found) {print $0;}}'
    

    【讨论】:

    • 你是如何运行它的?
    • 我收到:aa : 'This is what I want'};
    【解决方案3】:

    使用grep -oP可以使用匹配重置\K

    grep -oP "\baa\s*:\s*'\K[^']+" file
    
    This is what I want
    

    【讨论】:

      【解决方案4】:

      如果我真的在 AWK 中弯曲它:

      BEGIN {
          RS="- -it is not the spoon that bends, it is only yourself"
          FS="(aa : '|'};)"
      }
      {
          print $2
      }
      

      【讨论】:

        【解决方案5】:

        使用 GNU awk 进行多字符 RS:

        $ awk -v RS="aa[[:space:]]*:[[:space:]]*'[^']*'[[:space:]]*}[[:space:]]*;" -F"'" '{$0=RT; print $2; exit}' file
        This is what I want
        

        【讨论】:

          【解决方案6】:

          这是另一个解决方案,使用sed

          echo $'var obj = {\naa: \'This is what I want\'\n};
          var obj2 = {\naa: \'Unwanted\'\n};' | \
          sed -ne $'/aa:/ {N;s/aa: \'\\(.*\\)\'\\n.*/\\1/;T;p;q}'
          

          T;p;q 在第一次匹配时打印替换并退出,否则继续下一行。

          【讨论】:

            猜你喜欢
            • 2023-04-04
            • 1970-01-01
            • 2022-01-08
            • 2012-10-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-07
            • 2015-07-20
            相关资源
            最近更新 更多