如何在Bash正则表达式中正确使用引号?
解决Bash正则表达式引号冲突问题
你的问题核心是Bash中[[ =~ ]]正则匹配的引号规则和字符类内引号转义的冲突。以下是两种可行的解决方式:
方式一:使用ANSI-C引号定义正则变量
Bash的ANSI-C引号($'')支持正确转义特殊字符,能避免单双引号的语法冲突。把正则重新定义为:
REGEX=$'^\\s*-.*|^\\s*file:\\s*["\'].*' if [[ ${LINE} =~ ${REGEX} ]]; then # TODO fi
$''会自动解析内部的转义序列,这里\\s保持正则的空白匹配,["\']明确匹配双引号或单引号- 注意去掉原代码中
${REGEX}后面多余的.*,因为正则本身已经包含.*结尾,重复添加会冗余
方式二:直接将正则写入匹配语句
如果不需要复用正则,直接把正则写在[[ =~ ]]内,省去变量定义的麻烦:
if [[ ${LINE} =~ ^\s*-.*|^\s*file:\s*["\'].* ]]; then # TODO fi
- 这里的
["\']在无引号包裹的正则中,Bash会正确识别为字符类,匹配双引号或单引号
补充说明
原代码在Windows Bash正常是因为Windows环境下的Bash对引号解析的宽松性,但shellspec作为测试工具,对语法规范要求更严格,所以暴露了引号未正确转义的问题。Bash官方建议在[[ =~ ]]中不要给正则加引号,是因为加引号后正则会被当作普通字符串匹配,而非正则表达式,所以必须保证无引号的正则语法正确。
内容的提问来源于stack exchange,提问作者floriandev
相关产品推荐
相关产品推荐

