我正在尝试从一些文本中提取数字。目前我正在使用以下内容:
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
。