我想使用Bash正则表达式匹配(使用=~运算符)来匹配包含引号的字符串。例如,假设我有以下字符串,我想提取引号之间的文本:
foo='"Hello World!"'我的第一个尝试是将正则表达式放在强引号中,如下所示,强制引号为常规字符。
[[ "$foo" =~ '".*"' ]]这会失败,因为Bash将其解释为字符串匹配,而不是正则表达式。
然后我尝试用\来转义引号,如下所示:
[[ "$foo" =~ \".*\" ]]这就失败了(EDIT:实际上没有。如果\“和]]之间没有空格,它就会失败,但这里的版本工作得很好。)因为第一个\是纯bash文本,无法转义引号(我认为。VIM中的颜色表示第二个引号被转义,但不是第一个引号,脚本运行失败)。
那么有没有什么方法可以在不将正则表达式匹配转换为字符串匹配的情况下对“字符进行转义?
发布于 2014-06-12 03:02:33
实际上,在bash 3和bash 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!"https://stackoverflow.com/questions/24170397
复制相似问题