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

j.l*_*lee 5 bash

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

例子:

string1="something34521.32somethingmore3241"
Run Code Online (Sandbox Code Playgroud)

我想要的输出是 34521

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

谢谢!

kub*_*b1x 11

因此,为了简单起见,我将发布我到达这里时实际寻找的内容。

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

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

有时我喜欢在替换表达式中使用@而不是经典的,只是为了在所有这些斜杠和反斜杠中获得更好的可见性。使用路径时非常方便,因为您不需要转义斜杠。在这种情况下这并不重要。只是在说'。/sed

  • 这种模式对我来说有点疯狂,然后我意识到你使用的 sed 没有“扩展正则表达式”标志。这是扩展正则表达式的样子,更干净,因为您不需要转义括号和加号: `sed -E 's,^[^0-9]*([0-9]+)。 *$,\1,'` (2认同)

Fer*_*man 6

有 awk 解决方案:

echo $string1 | awk -F'[^0-9]+' '{ print $2 }'
Run Code Online (Sandbox Code Playgroud)

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


anu*_*ava 3

我认为这个 sed 1 班轮可以完成这项工作:

str="something34521.32somethingmore3241"
echo $str | sed -r 's/^([^.]+).*$/\1/; s/^[^0-9]*([0-9]+).*$/\1/'
Run Code Online (Sandbox Code Playgroud) 输出
34521
Run Code Online (Sandbox Code Playgroud)