我在 shell 中有一个奇怪的行为。
当我尝试将正则表达式中的“_”与其十六进制代码匹配时,它可以工作,但不能与“(”匹配。
$ regex1=$'\x5f'
$ pattern1='_'
$ if [[ $pattern1 =~ $regex1 ]]; then echo yes; else echo no; fi
yes
$ regex2=$'\x28'
$ pattern2='('
$ if [[ $pattern2 =~ $regex2 ]]; then echo yes; else echo no; fi
no
你能解释一下这种行为吗?
答案1
regex2=$'\x28'
完全等同于regex2='('
,shell$'...'
在赋值时处理引号。它(
本身是一个无效的正则表达式,因此[[ =~ ]]
通过返回以下退出状态来报告错误2
:
$ re='('; [[ "(" =~ $re ]]; echo "$?"
2
(当然,在if
语句中,您无法区分1
“不匹配”的退出代码和2
“错误”的退出代码之间的区别,但它确实存在。)
您需要从正则表达式中转义左括号:
$ re='\('; [[ "(" =~ $re ]] && echo match
match
或者将其放在括号组中:
$ re='[(]'; [[ "(" =~ $re ]] && echo match
match
经过快速测试,Bash 的正则表达式不支持十六进制或八进制字符转义,因此re='\050'
或re='\x28'
不起作用。