如何在带空格的模式后仅找到一个单词?

时间:2019-07-11 08:57:13

标签: awk sed terminal grep

我只想获取等号和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

但这不起作用

如何包含这些空格?

3 个答案:

答案 0 :(得分:1)

您可以像

一样使用sed
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),零个或多个空格的整行, =,再输入零个或多个空格,然后将任何0个或多个数字,点或连字符捕获到组1(\1)中。 -np选项将使sed仅打印替换结果。

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

答案 1 :(得分:0)

请您尝试一次。

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

答案 2 :(得分:0)

首先使用Final energy的grep,然后使用grep -o提取数字:

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