使用正则表达式在bash中获取2个字符串或分隔符之间的字符串

时间:2018-05-31 10:47:12

标签: regex bash shell

我的字符串是:

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脚本的初学者。

2 个答案:

答案 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个或多个字符
  • " - 双引号。

答案 1 :(得分:2)

Bash不支持环绕声断言。但你不需要它们:

regex='base_path: "([^"]*)"'