bash正则表达式匹配与否

时间:2018-12-09 12:21:38

标签: regex bash match

我创建了此正则表达式:

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

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

“ CPU负载:100平均:89”

,但有时值将不可用,例如:

“ 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负载:平均100:”失败

最新更新要求我:

 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 个答案:

答案 0 :(得分: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