使用bash和正则表达式获取字符串中的数字

时间:2015-02-11 10:44:50

标签: regex bash ubuntu

我需要在包含以下字符串的ascii文件中获得分数后面的数字:

iteration 32: score=0.126462

我想在bash中这样做。 所以输出应该是:

0.126462

我知道我必须使用正则表达式,但我不熟悉它,我无法在数小时后解决问题。 感谢

编辑:有些解决方案并不适合我,因为我并没有在某个变量中对字符串进行硬编码,而是在管道中传入。

  

cat kMeans.init-1.log |尾-2 |头-1 | CODE_SHOULD_GO_HERE

3 个答案:

答案 0 :(得分:1)

您不必使用正则表达式,但如果必须:

string='iteration 32: score=0.126462'
if [[ $string =~ score=([[:digit:]]+\.[[:digit:]]+)$ ]]; then
    number=${BASH_REMATCH[1]}
    printf 'Found number: %s\n' "$number"
else
    printf 'No number found.\n'
fi

没有正则表达式:

string='iteration 32: score=0.126462'
if [[ $string = *score=+([[:digit:]]).+([[:digit:]]) ]]; then
    number=${string##*score=}
    printf 'Found number: %s\n' "$number"
else
    printf 'No number found.\n'
fi

答案 1 :(得分:1)

Pure bash solution。

$ [[ "iteration 32: score=0.126462" =~ score=([0-9.]+) ]] && echo ${BASH_REMATCH[1]}
0.126462

通过grep,

$ echo 'iteration 32: score=0.126462' | grep -oP 'score=\K[\d.]+'
0.126462

答案 2 :(得分:1)

试试这个:

grep -E -m 1 'score=([0-9.]+)' your_file

将仅返回第一个匹配0.126462

或尝试your_file | sed "s/\result=([0-9.]\+\)/\1/"