【问题标题】:Get number in a string using bash and regular expressions使用 bash 和正则表达式获取字符串中的数字
【发布时间】:2015-04-11 16:52:08
【问题描述】:

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

iteration 32: score=0.126462

我想用 bash 来做。 所以输出应该是:

0.126462

我知道我必须使用正则表达式,但是我对它不是很熟悉,而且下班后我无法解决我的问题。 谢谢

编辑:不幸的是,有些解决方案对我不起作用,因为我不是在某个变量中硬编码字符串,而是在管道中传递。

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

【问题讨论】:

  • awk、sed、grep 怎么样?
  • 正如我所说,我不熟悉正则表达式。我发现的例子处理了匹配字符串中用空格分隔的数字。

标签: regex bash ubuntu


【解决方案1】:

试试这个:

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

将只返回第一个匹配 0.126462

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

【讨论】:

  • 这似乎只是突出显示“score=0.126462”我需要提取纯数字以便我可以打印到文本文件中
【解决方案2】:

纯 bash 解决方案。

$ [[ "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

【讨论】:

  • 字符串“iteration 32: score=0.126462”由一些使用“head”和“tail”的先前操作传递。所以我需要通过管道“|”获取命令的参数而不是硬编码字符串
  • 啊啊啊。非常感谢:)
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多