我创建了这个正则表达式:
'^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
演示