Bash的=~正则是否支持多行模式?命令匹配失败咨询
Bash正则多行匹配问题解答
问题核心原因
Bash的=~正则匹配默认处于单行模式:
^仅匹配整个输入字符串的开头,而非每行的行首$仅匹配整个输入字符串的结尾,而非每行的行尾
你的场景中,Commandout是包含两行内容的字符串,^hello world会尝试匹配整个字符串的开头(也就是第一行的Something),自然匹配失败。另外注意你的正则用的是小写hello,但实际内容是大写Hello,大小写不匹配也是失败的原因之一。
解决方案
方案1:开启Bash的多行正则模式
在正则表达式开头添加(?m)标记,强制开启多行模式,让^和$匹配每行的首尾:
Commandout=$(cmd) Match='(?m)^Hello world' # 修正大小写,添加多行标记 if [[ $Commandout =~ $Match ]]; then echo something fi
方案2:用grep辅助按行匹配
如果不想修改正则模式,可以借助grep的默认按行匹配特性:
Commandout=$(cmd) if echo "$Commandout" | grep -q '^Hello world'; then echo something fi
grep -q会静默执行,只要匹配到目标行就返回成功状态。
内容的提问来源于stack exchange,提问作者Harpreet
相关产品推荐
相关产品推荐

