bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin19)
描述:
我想从这个字符串字典中提取WorkingDir键值:
config="""
"TerraformCommand": "terragrunt-info",
"WorkingDir": "usr/terraform-modules/terraform-aws-codebuild/examples/.terragrunt-cache/xh9X2WgTwVjjRHiPBjKUl0Lr86w/SGN8gG45haGoXT7IhOh9_iuKkbc"
}
"""在这种情况下,预期的产出是:
"usr/terraform-modules/terraform-aws-codebuild/examples/.terragrunt-cache/xh9X2WgTwVjjRHiPBjKUl0Lr86w/SGN8gG45haGoXT7IhOh9_iuKkbc"尝试:
到目前为止,我已经尝试使用不同的方法,使用这种正向后/前瞻性模式:'(?<=("WorkingDir":\s")).+(?=")' 1。
echo `expr "$config" : '(?<=("WorkingDir":\s")).+(?=")'`输出:0
2.
pat='(?<=("WorkingDir":\s")).+(?=")'
[[ $config =~ $pat ]]
echo "${BASH_REMATCH[0]}"
echo "${BASH_REMATCH[1]}"产出:
echo $config | grep -o '(?<=("WorkingDir":\s")).+(?=")'产出:
发布于 2021-01-23 06:11:19
正如注释中指出的那样,expr只使用"basic“(又称”过时“)正则表达式,bash的=~运算符使用的regex引擎不支持前瞻性或后置(或者\s也是空格的缩写)。但是您不需要查找,只需匹配所有内容,并使用捕获组来选择所需的部分(并将模式存储在变量中以避免可能的解析不一致):
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
fihttps://stackoverflow.com/questions/65855862
复制相似问题