You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:41:10