【问题标题】:bash, extract string between two patternsbash,在两个模式之间提取字符串
【发布时间】:2013-05-28 07:36:27
【问题描述】:

我有一个包含如下 sn-p 的文本文件:

[#0] PROGRESS:Eval -- P values for  mu_sig-130-0 =  1
        CLs      = 0.0463722 +/- 0
        CLb      = 0.499991 +/- 0
        CLsplusb = 0.0231857 +/- 0

我想找到 CLs 行,然后只打印出数字 0.0463722

有没有办法通过 bash 命令行来做到这一点?

编辑:数字可以在文件之间更改,但该行的其余部分保持不变。

【问题讨论】:

    标签: string bash sed grep


    【解决方案1】:

    您可以为此使用 awk:

    awk '/    CLs      = 0.0463722 \+\/\- 0/ {print $3}' yourfile
    

    或者,如果您只是寻找包含 CLs= 的行(可能),那么将模式概括为:

    awk '/ CLs[ ]*=/ {print $3}' yourfile
    

    【讨论】:

    • 第二个 awk 命令似乎不起作用,我只得到 -- 作为输出。我已将我想要的数字前后的行放入原始帖子中。
    • 我已经对其进行了测试,它确实有效。您能否发布您的原始输入文件或至少在其前后一两行的有趣部分?
    【解决方案2】:
    awk '$1 == "CLs", $0 = $3'
    

    结果

    0.0463722

    【讨论】:

      【解决方案3】:

      awk 可能是要走的路,就像其他答案一样。这是一个GNU grep 替代方案,启用了 PCRE 正则表达式

      echo '    CLs      = 0.0463722 +/- 0' | grep -Po 'CLs\s+=\s+\K\d[.]\d+(?=[^\d])'
      0.0463722
      

      【讨论】:

      • 你在发帖前试过运行这个吗?运行此命令时,我什么也没得到。
      • @user788171,是的,从粘贴在上面的命令的输出中可以看出,它完成了我的工作。您可能最后错过了GNU grep
      • 所以,我的电脑上安装了 grep。我可以运行 grep 确定。 GNU grep 有什么不同吗?
      【解决方案4】:

      无论其他行看起来如何,这条 grep 行都可以正常工作。 (你提到那条线是独一无二的)。

      grep -oP "^\s*CLs\s*=\s*\K[0-9.]*" file
      

      【讨论】:

      • 我刚试过这个,我添加了更多关于前后线条的信息。您的命令没有给出任何输出。
      • 我尝试了您的新示例。我的 grep 行工作正常。我猜你没有 gnu grep?
      • GNU grep 与常规 grep 有什么不同吗?
      【解决方案5】:

      使用sed

      sed -nr '/\bCLs\b/ {s/.*= ([0-9.]+) .*/\1/p}' inputFile
      

      【讨论】:

      • 不是我。您的答案是迄今为止最接近的答案。不幸的是,它输出了所有 3 个数字,而不仅仅是我需要的那个。
      • @user788171 没关系。 :) 我添加了一个更新以包含单词边界。
      【解决方案6】:

      GNU sed

      sed '/CLs\s/!d;s/.*=\s\([.0-9]\+\).*/\1/' file
      

      【讨论】:

        猜你喜欢
        • 2020-10-15
        • 2012-07-07
        • 1970-01-01
        • 1970-01-01
        • 2014-07-18
        • 1970-01-01
        • 2018-11-23
        • 2018-11-22
        • 1970-01-01
        相关资源
        最近更新 更多