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

Bash正则提取Git配置文件特定字符串存变量失败问题排查

Fix for Extracting Git Remote Origin URL from Config File

我明白你的问题了——原来的sed脚本因为Git配置里的远程URL从HTTPS格式改成了SSH格式,再加上原脚本的正则匹配逻辑太局限,所以完全抓不到目标内容,导致输出为空。下面给你两个更可靠的解决方案,都能准确提取[remote "origin"]块里的URL:

方案1:用awk(更简洁直观)

awk非常适合处理这种分段的配置文件,逻辑清晰且不易出错:

var3=$(awk '/\[remote "origin"\]/ {flag=1; next} flag && /url =/ {sub(/.*url = /, ""); print; exit}' .git/config)
echo "\"this is repo\""
echo "\"$var3\""

逻辑解释:

  • /\[remote "origin"\]/ {flag=1; next}:当匹配到[remote "origin"]行时,设置一个标志位flag=1,并跳过当前行
  • flag && /url =/:当标志位为1时,匹配包含url =的行
  • sub(/.*url = /, ""):把行里url =及其前面的内容全部替换为空,只留下URL部分
  • print; exit:打印提取到的URL后直接退出,避免匹配到其他可能的url行

方案2:修改后的sed脚本

如果你更习惯用sed,可以调整正则匹配逻辑,不再局限于HTTPS格式:

var3=$(sed -n '/\[remote "origin"\]/,/fetch =/ s/^[ \t]*url = //p' .git/config | tr -d '\n')
echo "\"this is repo\""
echo "\"$var3\""

逻辑解释:

  • /\[remote "origin"\]/,/fetch =/:定位到[remote "origin"]到fetch =的内容区间
  • s/^[ \t]*url = //p:替换掉行首的空格/制表符和url =,只保留URL,并用p打印匹配到的行
  • tr -d '\n':确保输出没有换行符,符合你要的无换行字符串要求

为什么原脚本失效?

原脚本的正则.*https:\/\/(.*?)fetch.*有两个致命问题:

  1. 只匹配HTTPS开头的URL,但你的配置里现在是SSH格式的git@github.com:user/repo.git,完全不匹配
  2. 依赖URL和fetch在同一行(或者合并后在同一位置),但原脚本先合并所有行,再找https://到fetch之间的内容,一旦格式变化就失效

测试结果

运行上面任意一个脚本,都会得到你期望的输出:

"this is repo"
"git@github.com:user/repo.git"

内容的提问来源于stack exchange,提问作者tatsu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:03:57