首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Bash正则表达式匹配(=~),其中正则表达式包含引号(“字符”)

问使用Bash正则表达式匹配(=~),其中正则表达式包含引号(“字符”)
EN

Stack Overflow用户
提问于 2014-06-12 02:50:24
回答 1查看 12.1K关注 0票数 2

我想使用Bash正则表达式匹配(使用=~运算符)来匹配包含引号的字符串。例如,假设我有以下字符串,我想提取引号之间的文本:

代码语言:javascript
复制
foo='"Hello World!"'

我的第一个尝试是将正则表达式放在强引号中,如下所示,强制引号为常规字符。

代码语言:javascript
复制
[[ "$foo" =~ '".*"' ]]

这会失败,因为Bash将其解释为字符串匹配,而不是正则表达式。

然后我尝试用\来转义引号,如下所示:

代码语言:javascript
复制
[[ "$foo" =~ \".*\" ]]

这就失败了(EDIT:实际上没有。如果\“和]]之间没有空格,它就会失败,但这里的版本工作得很好。)因为第一个\是纯bash文本,无法转义引号(我认为。VIM中的颜色表示第二个引号被转义,但不是第一个引号,脚本运行失败)。

那么有没有什么方法可以在不将正则表达式匹配转换为字符串匹配的情况下对“字符进行转义?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-12 03:02:33

实际上,在bash 3和bash 4中,您的第二次尝试对我有效:

代码语言:javascript
复制
$ 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如何将表达式作为一个整体进行解释有关。只要正则表达式字符本身没有被引用,表达式的其余部分就可以被引用,而不会产生副作用:

代码语言:javascript
复制
$ [[ $foo =~ '"'.*'"' ]] && echo $BASH_REMATCH
"Hello World!"

但也许最简单的方法是使用第二个变量来保存正则表达式本身。

代码语言:javascript
复制
$ exp='".*"'
$ [[ $foo =~ $exp ]] && echo $BASH_REMATCH
"Hello World!"
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24170397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档