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.*有两个致命问题:
- 只匹配HTTPS开头的URL,但你的配置里现在是SSH格式的
git@github.com:user/repo.git,完全不匹配 - 依赖URL和
fetch在同一行(或者合并后在同一位置),但原脚本先合并所有行,再找https://到fetch之间的内容,一旦格式变化就失效
测试结果
运行上面任意一个脚本,都会得到你期望的输出:
"this is repo" "git@github.com:user/repo.git"
内容的提问来源于stack exchange,提问作者tatsu
相关产品推荐
相关产品推荐

