【问题标题】:bash script for regular expression Err: [1-9] [duplicate]正则表达式错误的 bash 脚本:[1-9] [重复]
【发布时间】:2021-08-31 21:59:47
【问题描述】:

我确定这是一件小事,但我对 bash 和正则表达式还比较陌生,

给定一个字符串 summary = 689 in 2s = 350.3/s Avg: 4 Min: 0 Max: 84 Err: 24 (3.48%) 我想检查文本 Err: [1-9] 是否出现在 bash 脚本的给定字符串中。为了实现这一点,我编写了以下脚本

digit="Err: 8"

if [[ $digit =~ 'Err: [1-9]' ]]; 
then
    echo "$digit is a digit"
else
    echo "oops"
fi

然而这不起作用,它会进入假的。当我使用在线工具测试正则表达式时,它似乎工作正常,我不确定这里有什么问题。

【问题讨论】:

  • 将您的正则表达式模式放入一个变量中,然后在 if statament 中使用该变量。
  • [1-9] 部分用引号引起来,因此它被视为文字字符串而不是模式。您可以使用 use 'Err: '[1-9]Err:\ [1-9] 或将模式放入 Alireza 所说的变量中(然后在使用时不要在变量周围加上引号)。请参阅:How do I use regular expressions in bash scripts? BTW,您在这里并不需要完整的正则表达式,您可以使用 glob(又名通配符)模式:if [[ "$digit" = *'Err: '[1-9]* ]]

标签: regex bash


【解决方案1】:

您可以将您的正则表达式模式放入一个变量中,并在 if 语句中使用该变量,如下所示:

digit="Err: 8"
pattern="Err: [1-9]"
if [[ $digit =~ $pattern ]]; 
then
    echo "$digit is a digit"
else
    echo "oops"
fi

或者如果你不想使用额外的变量,你可以像这样改变你的 if 语句:

digit="Err: 8"
if [[ $digit =~ Err:\ [1-9] ]]; 
then
    echo "$digit is a digit"
else
    echo "oops"
fi

【讨论】:

    【解决方案2】:

    您可以使用[[:blank:]] 来匹配空格和制表符,而无需使用引号:

    if [[ $digit =~ Err:[[:blank:]][1-9] ]]; 
    

    或者你可以逃离空间:

    if [[ $digit =~ Err:\ [1-9] ]];
    

    或者将带引号的模式放在变量中:

    pattern='Err: [1-9]'
    if [[ $digit =~ $pattern ]];
    

    由于第一个示例字符串似乎有多个空格,您可以重复字符类:

    digit="summary =    689 in     2s =  350.3/s Avg:     4 Min:     0 Max:    84 Err:    24 (3.48%)"
    pattern='Err: [1-9]'
    if [[ $digit =~ Err:[[:blank:]]+[1-9] ]];
    then
        echo "$digit is a digit"
    else
        echo "oops"
    fi
    

    输出

    summary =    689 in     2s =  350.3/s Avg:     4 Min:     0 Max:    84 Err:    24 (3.48%) is a digit
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      • 2021-09-17
      • 2013-06-06
      • 2011-10-17
      • 1970-01-01
      相关资源
      最近更新 更多