Bash中用正则提取配置里base_path路径失败求助
解决Bash正则提取配置路径无输出的问题
我来帮你搞定这个问题~你的脚本没输出的核心原因是Bash原生的=~正则匹配不支持Perl风格的正向预查((?<=...)和(?=...)),而且原正则也没考虑配置里的空格和引号细节,导致匹配失败。
先回顾你的场景:
- 目标配置内容:
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
下面给你几种可行的解决方案:
方案1:调整Bash原生正则(推荐,无需额外工具)
修改正则表达式,不用零宽断言,直接匹配base_path:后的引号内内容,同时兼容可能的空格:
config_file=$(<conf.conf) # 匹配base_path: 后任意空格,再捕获引号内的路径内容 regex='base_path:[[:space:]]*"([^"]+)"' if [[ $config_file =~ $regex ]]; then echo "${BASH_REMATCH[1]}" fi
解释:
[[:space:]]*:匹配base_path:后面的任意空格(避免配置里的空格导致匹配失败)"([^"]+)":捕获引号内的所有非引号字符,正好是你需要的纯路径
方案2:用grep的Perl兼容模式(贴近你原来的思路)
如果你的系统grep支持-P选项(大部分Linux发行版都支持),可以用Perl风格正则实现你原本的预查思路:
grep -Po '(?<=base_path: ")[^"]+' conf.conf
解释:
-P:启用Perl兼容正则,支持正向预查(?<=base_path: "):匹配base_path: "之后的位置(不包含该字符串本身)[^"]+:匹配到下一个引号前的所有字符,即目标路径
方案3:用awk快速分割提取
对于这种结构化的配置文本,awk的分割功能更简单直接:
awk -F'base_path: "|",' '{print $2}' conf.conf
解释:
-F'base_path: "|",':把base_path: "和",作为分隔符print $2:直接输出分割后的第二部分,就是目标路径
内容的提问来源于stack exchange,提问作者Yoda
相关产品推荐
相关产品推荐

