如何在bash脚本中使用sed-to-regex字符串和数字

如何在bash脚本中使用sed-to-regex字符串和数字,regex,bash,separator,Regex,Bash,Separator,我想分离文件中的字符串和数字,以在bash脚本中获得特定的数字,例如: 执行分行:1190家中的75.38% 我只想知道电话号码 75.38 。我已经尝试了下面的代码 $new_value=value | sed -r 's/.*_([0-9]*)\..*/\1/g' 但这是不正确的,它失败了 它应该如何工作?感谢您的帮助。您可以使用以下正则表达式提取行中的第一个数字: ^[^0-9]*\([0-9.]*\).*$ 用法: % echo 'Branches executed:75.38% o

我想分离文件中的字符串和数字,以在bash脚本中获得特定的数字,例如:

执行分行:1190家中的75.38%

我只想知道电话号码

75.38

。我已经尝试了下面的代码

$new_value=value | sed -r 's/.*_([0-9]*)\..*/\1/g'
但这是不正确的,它失败了


它应该如何工作?感谢您的帮助。

您可以使用以下正则表达式提取行中的第一个数字:

^[^0-9]*\([0-9.]*\).*$
用法:

% echo 'Branches executed:75.38% of 1190' | sed 's/^[^0-9]*\([0-9.]*\).*$/\1/'
75.38
尝试一下:

value=$(sed "s/^Branches executed:\([0-9][.0-9]*[0-9]*\)%.*$/\1/" afile)
假定该行在文件中只出现一次


该值存储在value变量中。

这里有几点我们可以改进。一个是您需要对sed中的括号进行转义:
\(…\)

另一个是,最好有一个完整的输入字符串规范和一个好的脚本来帮助我们处理这个问题

无论如何,这是我第一次尝试: 更新:我在这个正则表达式中添加了更多的bash,因此它更容易使用:

value='Branches executed:75.38% of 1190'
new_value=`echo $value | sed -e 's/[^0-9]*\([0-9]*\.[0-9]*\).*/\1/g'`
echo $new_value
更新2:如前所述,它将只匹配包含小数点的数字。我们可以使用一个可选组来修复它:
\(\.[0-9]\+\)?
。 关于可选组的说明:

  • \(…\)
    是一个组
  • \(…\)?
    是一个显示零次或一次的组(请注意问号)
  • \.[0-9]\+
    是一个点和一个或多个数字的图案
综合起来:

value='Branches executed:75.38% of 1190'
new_value=`echo $value | sed -e 's/[^0-9]*\([0-9]\+\(\.[0-9]\+\)\?\).*/\1/g'`
echo $new_value

失败。
如何,您期望得到什么,得到了什么?我想从包含字符串和数字的文件中获取值。例如,有一个文件包含“执行的分支:1190的75.38%”,然后我希望从该文件中获取值“75.38”。我尝试过使用这个“$new\u value=value | sed-r的s/*.[0-9]*)\..*/\1/g”,但它不起作用。所以我请求帮助使用sed来正则化文件。这就是我所期望和得到的。在此之前谢谢您听起来OP对sed并不太熟悉,因此请给出一个简短的解释:
[^0-9]*
表示匹配所有不在0-9范围内的字符(以
^
开始的范围表示匹配任何字符,但不匹配)。这将在到达第一个数字时停止使用字符。
\([0-9]*\.[0-9]*\)
匹配任何带有一个小数位的数字,并将其存储在
\1
中(但它不会匹配没有小数位的数字…)。
*
将其余字符匹配到行尾。不喜欢这个正则表达式。。。最后一个
[0-9]*
是多余的(它将被前面的
[.0-9]*
捕获)。这将用多个小数匹配数字(即
78.6.5.4…
)。它还假设前面的文本是一个精确的字符串,而不是捕获行中的第一个数字,我认为这不是OP的意图(虽然我可能错了)。是的!最后一个数字是用前一个字符模式捕获的,但它只是一个数字,不包括带有结尾的字符串。