【问题标题】:How can I use sed to regex string and number in bash script如何在 bash 脚本中使用 sed 正则表达式字符串和数字
【发布时间】:2016-04-15 13:53:16
【问题描述】:

我想将文件中的字符串和数字分开,以获取bash脚本中的特定数字,例如:

已执行的分支:1190 的 75.38%

我只想得到号码

75.38

。我尝试了下面的代码

$new_value=value | sed -r 's/.*_([0-9]*)\..*/\1/g'

但它不正确并且失败了。

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

【问题讨论】:

  • it was failed. 怎么样,你期待什么,你得到了什么?
  • 我想从包含字符串和数字的文件中获取值。例如,有一个文件包含“已执行的分支:1190 的 75.38%”,那么我想从文件中获取值“75.38”。我曾尝试使用此“$new_value=value | sed -r 's/.*_([0-9]*)\..*/\1/g”,但它不起作用。所以我寻求帮助以使用 sed 对文件进行正则表达式。这就是我所期望和得到的。之前谢谢你

标签: regex bash separator


【解决方案1】:

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

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

用法:

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

【讨论】:

    【解决方案2】:

    试试这个:

    value=$(sed "s/^Branches executed:\([0-9][.0-9]*[0-9]*\)%.*$/\1/" afile)
    

    假设该行在afile中只出现一次。

    值存储在 value 变量中。

    【讨论】:

    • 不喜欢这个正则表达式...最后一个[0-9]* 是多余的(它将被前面的[.0-9]* 捕获。这将匹配具有多个小数的数字(即78.6.5.4...)。它还假设前面的文本是一个精确的字符串,而不是捕获该行中的第一个数字,我不认为这是 OP 的意图(虽然我可能是错的)。
    • 真的!最后一个数字将使用前一个字符模式捕获,但它只是一个数字,不包括带有最终 . 的字符串
    【解决方案3】:

    这里有几处我们可以改进。一是你需要对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: 正如john 指出的那样,它将仅匹配包含小数点的数字。我们可以使用一个可选组来修复它:\(\.[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
    

    【讨论】:

    • 听起来好像OP对sed不太熟悉,所以简单解释一下:[^0-9]*表示匹配所有不在0-9范围内的字符(以@开头的范围987654330@ 表示不匹配)。这将在达到第一个数字时停止消耗字符。 \([0-9]*\.[0-9]*\) 匹配任何带一个小数位的数字,并将其存储在 \1 中(尽管它不会匹配没有小数的数字......)。 .* 将其余字符匹配到行尾。
    猜你喜欢
    • 2011-04-12
    • 1970-01-01
    • 2016-07-05
    • 2012-12-13
    • 1970-01-01
    • 2014-05-31
    • 2015-04-11
    • 2014-09-29
    • 2017-12-14
    相关资源
    最近更新 更多