从字符串中提取正/负浮点数

从字符串中提取正/负浮点数

我正在尝试从一些文本中提取数字。目前我正在使用以下内容:

echo "2.5 test. test -50.8" | tr '\n' ' ' | sed -e 's/[^0-9.]/ /g' -e 's/^ *//g' -e 's/ *$//g' | tr -s ' '

这会给我 2.5,“。”和50.8。我应该如何修改第一个sed以便它检测浮点数,无论是正数还是负数?

答案1

grep对此效果很好:

$ echo "2.5 test. test -50.8" | grep -Eo '[+-]?[0-9]+([.][0-9]+)?'
2.5
-50.8

怎么运行的

  • -E

    使用扩展正则表达式。

  • -o

    仅返回匹配项,而不返回上下文

  • [+-]?[0-9]+([.][0-9]+)?+

    匹配号码被标识为:

    • [+-]?

      可选的引导标志

    • [0-9]+

      一个或多个数字

    • ([.][0-9]+)?

      可选句点后跟一个或多个数字。

在一行上获取输出

$ echo "2.5 test. test -50.8" | grep -Eo '[+-]?[0-9]+([.][0-9]+)?' | tr '\n' ' '; echo ""
2.5 -50.8

答案2

一个grep办法:

$ echo "2.5 test. test -50.8" | tr ' ' '\n' | grep -E '^[+-]?[0-9]*\.?([0-9]+)$'
2.5
-50.8
  • 只是tr通过用换行符替换空格来将行转换为多行。

  • grep命令查找以可选的+或开头的字符串-,可能后跟一些数字和可选的小数点。然后我们需要在末尾添加一些数字。

这会让诸如 之类的东西通过00000123.91288000,这看起来很奇怪。这是我们想要过滤掉的数字吗?从技术上讲,它是一个浮点数,只是格式很奇怪。

编辑: 到适当地检查数字,执行不是编写您自己的正则表达式!使用来自可靠地方的库例程。

就我而言,我会使用 Perl 的Scalar::Util包,它有一个方便的looks_like_number()子例程:

$ echo "2.5 test. test -50.8" | tr ' ' '\n' | perl -MScalar::Util -ne 'Scalar::Util::looks_like_number($_) && print'
2.5
-50.8

这还有额外的好处,可以在其他形式中查找数字,例如1e3

相关内容