我想使用 Bash 正则表达式匹配(使用 =~ 运算符)来匹配包含引号的字符串。举例来说,我有以下字符串,我想提取引号之间的文本:
foo='"Hello World!"'
我的第一次尝试是将正则表达式放在强引号中,以强制引号为常规字符。
[[ "$foo" =~ '".*"' ]]
这会失败,因为 Bash 将此解释为字符串匹配而不是正则表达式。
然后我尝试用 \ 转义引号,如下所示:
[[ "$foo" =~ \".*\" ]]
那失败了(编辑:实际上,它没有。如果 \" 和 ]] 之间没有空格,它就会失败,但这里的版本工作得很好。)因为第一个 \ 是纯 bash 文本并且无法转义引号(我想一想。VIM 中的颜色表明第二个引号被转义,但第一个引号没有转义,因此运行脚本失败)。
那么有什么方法可以转义 " 字符而不将正则表达式匹配转换为字符串匹配吗?
实际上,你的第二次尝试在 bash 3 和 4 中对我有用:
$ echo "$BASH_VERSION"
3.2.51(1)-release
$ echo "$foo"
"Hello World!"
$ [[ "$foo" =~ \".*\" ]] && echo $BASH_REMATCH
"Hello World!"
$ echo "$BASH_VERSION"
4.3.18(1)-release
$ echo "$foo"
"Hello World!"
$ [[ "$foo" =~ \".*\" ]] && echo "${BASH_REMATCH[0]}"
"Hello World!"
然而,先谈谈理论,这一切都与 bash 如何解释整个表达式有关。只要正则表达式字符本身不被引用,表达式的其余部分就可以被引用而不会产生副作用:
$ [[ $foo =~ '"'.*'"' ]] && echo $BASH_REMATCH
"Hello World!"
但也许最简单的方法是使用第二个变量来保存正则表达式本身。
$ exp='".*"'
$ [[ $foo =~ $exp ]] && echo $BASH_REMATCH
"Hello World!"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)