首页 文章

bash正则表达式匹配与否

提问于
浏览
0

我创建了这个正则表达式:

'^CPU\s+LOAD\:\s+([0-9]{1,3})\s+Average\:\s+([0-9]{1,3}).?$'

匹配并从我的字符串中提取值:

“CPU负载:100平均:89”

但有时候 Value 不可用,例如:

“CPU负载:平均:89”

“CPU负载:100平均:”

“CPU负载:平均:”

并且它不会匹配,但我需要它作为占位符在值不存在时返回“” .

所以我尝试了几件事,我想这个:

'^CPU\s+LOAD\:\s+([[0-9]{1,3}]?)\s+Average\:\s+([[0-9]{1,3}]?).?$'

应该工作,但似乎不是 . 这是正确的语法吗?

这是我的测试代码,想要失败答案1我跟着链接,它似乎在链接页面工作 .

rx='^CPU\s+LOAD\:\s+(?:([0-9]{1,3})\s+)?Average:(?:\s+([0-9]{1,3}))?$'
line="CPU LOAD: 89 Average: 99"
  if [[ $line =~ $rx ]]; then
    printf "\n\n${BASH_REMATCH[1]} ${BASH_REMATCH[2]}\n\n"
  else
    printf "\n\nDidn't Match\n\n"
  fi

我更新了

rx='^CPU\ +LOAD\:\ +(([0-9]{1,3})\ +)?Average:(\ +([0-9]{1,3}))?$'

和“CPU负载:100平均:89”通过

“CPU负载:平均:89”通过

“CPU LOAD:100 Average:”失败

最新的更新要求我:

printf "\n\n${BASH_REMATCH[1]} ${BASH_REMATCH[2]} ${BASH_REMATCH[3]} ${BASH_REMATCH[4]}\n\n"

捕获所有内容并将单个值放入

${BASH_REMATCH[1]} ${BASH_REMATCH[2]}

感谢Forth Bird的帮助 . 这是适合我需求的最终代码 .

rx='^CPU\s+LOAD:\s+(([0-9]{1,3})\s+)?Average:(\s+([0-9]{1,3}))?.?$'

1 回答

  • 1

    你可能会做的是使用一个可选的非捕获组:

    ^CPU[[:blank:]]+LOAD\:[[:blank:]]+(([0-9]{1,3})[[:blank:]]+)?Average:([[:blank:]]+([0-9]{1,3}))?$

    regex demo

    您可以通过转义空间来匹配空格,或使用 [[:blank:]] 来匹配空格或制表符 .

    rx='^CPU[[:blank:]]+LOAD\:[[:blank:]]+(([0-9]{1,3})[[:blank:]]+)?Average:([[:blank:]]+([0-9]{1,3}))?$'
    line="CPU LOAD: 89 Average: 99"
    if [[ $line =~ $rx ]]; then
        printf "\n\n${BASH_REMATCH[2]} ${BASH_REMATCH[4]}\n\n"
    else
        printf "\n\nDidn't Match\n\n"
    fi
    

    Demo

相关问题