【问题标题】:How to find only one word after a pattern with spaces?如何在带空格的模式后只找到一个单词?
【发布时间】:2019-11-20 22:40:16
【问题描述】:

我只想得到等号和 eV 之间的数字

Final energy =  -2959.123199674     eV

我不能只 grep 等号,因为这个文件中的等号太多了。我想grep“最终能量=”并取回-2959.123199674。

我试过了:

awk '{for(i=1;i<=NF;i++)if($i=="Final Energy =")print $(i+1)}' filename

但它不起作用

我怎样才能包含这些空格?

【问题讨论】:

    标签: awk sed terminal grep


    【解决方案1】:

    先grepFinal energy,然后使用grep -o提取数字:

    grep 'Final energy =' | grep -o '[-[:digit:].]*'
    

    【讨论】:

      【解决方案2】:

      你可以使用sedlike

      sed -n 's/.*Final [Ee]nergy *= *\([0-9.-]*\).*/\1/p' filename
      

      online sed demo

      s="Final energy =  -2959.123199674     eV"
      sed -n 's/.*Final [Ee]nergy *= *\([0-9.-]*\).*/\1/p'  <<< "$s"
      # => -2959.123199674
      

      .*Final [Ee]nergy *= *\([0-9.-]*\).* POSIX BRE 模式将匹配包含 Final energy 的整行(我使用括号表达式匹配 eE),零个或多个空格,=,同样是零个或多个空格,然后将捕获到第 1 组 (\1) 任何 0 个或多个数字、点或连字符。 -np 选项将使sed 只打印替换结果。

      如果您希望将除空格以外的任何字符捕获到第 1 组中,请将 [0-9.-]* 替换为 [^[:space:]]*。甚至[^ ]*

      【讨论】:

      • 你知道我如何匹配以“* x”而不是“Final energy =”开头的行吗?星号可能有问题?
      • @Caterina 没问题,使用/^\* x/ 匹配行首的* x 子字符串。
      【解决方案3】:

      请您尝试关注一次。

      awk '{sub(/.*=/,"");sub(/eV.*/,"");gsub(/^ +| +$/,"")} 1' Input_file
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-12
        • 1970-01-01
        • 2021-06-07
        相关资源
        最近更新 更多