bash正则表达式是否匹配



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

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

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

"CPU负载:100平均:89">

但偶尔这些值将不可用,例如:

"CPU负载:平均:89">

"CPU负载:100平均:">

"CPU负载:平均值:">

它将不匹配,但我需要它作为占位符,以便在值不存在时返回"。

所以我尝试了几种方法,我认为这是:

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

应该有效,但似乎无效。这是正确的语法吗?

这是我的测试代码,想不通过答案1。我点击了链接,它似乎在链接页面上工作。

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

我更新了

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

以及"CPU负载:100平均:89"通过

"CPU负载:平均:89"通过

"CPU负载:100平均:"失败

最新更新要求我:

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

捕获所有内容并将任意一个值放入

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

感谢福斯·伯德的帮助。这是满足我需求的最终代码。

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

您可以使用一个可选的非捕获组:

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

查看regex演示

您可以通过转义空格来匹配空格,或者使用[[: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 "nn${BASH_REMATCH[2]} ${BASH_REMATCH[4]}nn"
else
printf "nnDidn't Matchnn"
fi

演示

相关内容

最新更新