Bash,提取两个模式之间的字符串

3

我有一个文本文件,其中包含类似于以下的片段:

[#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命令行完成吗?注意:文件中的数字可能会发生变化,但该行其余部分不变。
6个回答

2
awk '$1 == "CLs", $0 = $3'

Result

0.0463722

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

不是我。你的答案到目前为止是最接近的。不幸的是,它输出了所有三个数字,而不仅仅是我需要的那一个。 - user788171
@user788171 好的,没问题。 :) 我添加了一个更新,包括单词边界。 - jaypal singh

1
你可以使用awk来实现这个功能:
awk '/    CLs      = 0.0463722 \+\/\- 0/ {print $3}' yourfile

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

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

第二个awk命令似乎不起作用,我只得到--作为输出。我已经将我想要的数字之前和之后的行放入了原始帖子中。 - user788171
我已经测试过了,它运行正常。你能发布你的原始输入文件吗?或者至少将有趣的部分与之前和之后的一两行一起发出来吗? - hek2mgl

0

awk 可能是前进的方式,如其他答案所述。这里是一个启用了 PCRE 正则表达式的 GNU grep 替代方案。

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

你在发布之前尝试运行过吗?当我运行这个命令时,什么输出都没有。 - user788171
@user788171,是的,如上面粘贴的命令输出所示,在我的电脑上它可以完成任务。你可能在你的电脑上缺少了“GNU grep”? - iruvar
所以,grep已经安装在我的电脑上了。我可以正常运行grep。GNU grep是不是有什么不同? - user788171

0

这个 grep 命令行可以适用于其他行的格式,因为你提到该行是唯一的。

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

我刚试了一下,我添加了更多关于前后行的信息。你的命令没有输出任何内容。 - user788171
我尝试了你的新例子。我的grep命令行运行良好。我猜你没有GNU grep? - Kent
GNU grep和普通grep有什么不同吗? - user788171

0

GNU sed

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接