从字符串中提取第一个数字

时间:2011-04-27 23:08:34

标签: bash

我想从给定的字符串中提取第一个数字。这个数字是一个浮点数,但我只需要十进制数之前的整数。

示例:

string1="something34521.32somethingmore3241"

我想要的输出是34521

在bash中执行此操作的最简单方法是什么?

谢谢!

4 个答案:

答案 0 :(得分:3)

你说你有一个字符串,你想提取数字,我想你也有其他东西。

$ echo $string
test.doc_23.001
$ [[ $string =~ [^0-9]*([0-9]+)\.[0-9]+ ]]
$ echo "${BASH_REMATCH[1]}"
23

$ foo=2.3
$ [[ $string =~ [^0-9]*([0-9]+)\.[0-9]+ ]]
$ echo "${BASH_REMATCH[1]}"
2

$ string1="something34521.32somethingmore3241"
$ [[ $string1 =~ [^0-9]*([0-9]+)\.[0-9]+ ]]
$ echo "${BASH_REMATCH[1]}"
34521

答案 1 :(得分:2)

这个sed 1班轮将完成我认为的工作:

str="something34521.32somethingmore3241"
echo $str | sed -r 's/^([^.]+).*$/\1/; s/^[^0-9]*([0-9]+).*$/\1/'
OUTPUT
34521

答案 2 :(得分:1)

所以为了简单起见,我会发布当我到达这里时我真正想要的东西。

echo $string1 | sed 's@^[^0-9]*\([0-9]\+\).*@\1@'

只需从字符串^[^0-9]*的开头跳过不是数字的数字,然后匹配数字\([0-9]\+\),然后匹配字符串.*的其余部分,并仅打印匹配的数字{{ 1}}。

我有时希望在\1替换表达式中使用@而不是经典/,以便在所有斜杠和反斜杠中获得更好的可见性。使用路径时很方便,因为您不需要逃避斜线。在这种情况下并不重要。只是在说'。

答案 3 :(得分:0)

有 awk 解决方案:

echo $string1 | awk -F'[^0-9]+' '{ print $2 }'

使用 -F'[^0-9,]+' 将字段分隔符设置为不是数字 (0-9) 或逗号的任何内容,然后打印出来。