首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash使用字符串上带有查找模式的匹配正则表达式

Bash使用字符串上带有查找模式的匹配正则表达式
EN

Stack Overflow用户
提问于 2021-01-23 04:53:58
回答 1查看 191关注 0票数 0

bash --version

GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin19)

描述:

我想从这个字符串字典中提取WorkingDir键值:

代码语言:javascript
复制
config="""
"TerraformCommand": "terragrunt-info",
  "WorkingDir": "usr/terraform-modules/terraform-aws-codebuild/examples/.terragrunt-cache/xh9X2WgTwVjjRHiPBjKUl0Lr86w/SGN8gG45haGoXT7IhOh9_iuKkbc"
}
"""

在这种情况下,预期的产出是:

代码语言:javascript
复制
"usr/terraform-modules/terraform-aws-codebuild/examples/.terragrunt-cache/xh9X2WgTwVjjRHiPBjKUl0Lr86w/SGN8gG45haGoXT7IhOh9_iuKkbc"

尝试:

到目前为止,我已经尝试使用不同的方法,使用这种正向后/前瞻性模式:'(?<=("WorkingDir":\s")).+(?=")' 1。

代码语言:javascript
复制
echo `expr "$config" : '(?<=("WorkingDir":\s")).+(?=")'`

输出:0

2.

代码语言:javascript
复制
pat='(?<=("WorkingDir":\s")).+(?=")'
[[ $config =~ $pat ]]
echo "${BASH_REMATCH[0]}"
echo "${BASH_REMATCH[1]}"

产出:

代码语言:javascript
复制

代码语言:javascript
复制
echo $config | grep -o '(?<=("WorkingDir":\s")).+(?=")'

产出:

代码语言:javascript
复制
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-23 06:11:19

正如注释中指出的那样,expr只使用"basic“(又称”过时“)正则表达式,bash的=~运算符使用的regex引擎不支持前瞻性或后置(或者\s也是空格的缩写)。但是您不需要查找,只需匹配所有内容,并使用捕获组来选择所需的部分(并将模式存储在变量中以避免可能的解析不一致):

代码语言:javascript
复制
WorkingDirPattern='\"WorkingDir":[[:space:]]\"([^"]+)\"'
if [[ "$config" =~ $WorkingDirPattern ]]; then
    WorkingDir="${BASH_REMATCH[1]}"    # get the contents of the first capture group
    echo "WorkingDir is $WorkingDir"
else
    echo "No WorkingDir found" >&2
fi
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65855862

复制
相关文章

相似问题

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