我的字符串是:
model_config_list: {
config: {
name: "123-model",
base_path: "/modelServers/tests-integration/resources/models/123-model",
model_platform: "tensorflow",
model_version_policy: {
all: {}
}
}
我想提取:
/modelServers/tests-integration/resources/models/123-model
为此我写了bash脚本:
config_file=$(<conf.conf)
regex="(?<=base_path:)(.*)(?=,)"
if [[ $config_file =~ $regex ]];then echo ${BASH_REMATCH[1]}; fi
但是,我没有得到任何输出。我是Bash脚本的初学者。
答案 0 :(得分:3)
你需要使用带有捕获组的正则表达式而不是Bash正则表达式中不支持的外观:
/modelServers/tests-integration/resources/models/123-model
输出:
(?<=base_path:)
请参阅Bash demo online。
<强>详情
Bash正则表达式不支持肯定的(?=,)
lookbehind和base_path:
前瞻。这里的要点是将"
与其后的任何空格匹配,然后匹配"
,然后将除[^"]+
之外的任何一个或多个字符捕获到第1组中(使用否定括号表达式{{ 1}})。
base_path:
- 文字子字符串[[:space:]]*
- 0+空白字符"
- 双引号([^"]+)
- 除"
字符"
- 双引号。答案 1 :(得分:2)
Bash不支持环绕声断言。但你不需要它们:
regex='base_path: "([^"]*)"'