我创建了这个正则表达式:
'^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 回答
你可能会做的是使用一个可选的非捕获组:
^CPU[[:blank:]]+LOAD\:[[:blank:]]+(([0-9]{1,3})[[:blank:]]+)?Average:([[:blank:]]+([0-9]{1,3}))?$
见regex demo
您可以通过转义空间来匹配空格,或使用
[[:blank:]]
来匹配空格或制表符 .Demo