![在 bash 中从 GitHub 网址提取存储库名称](https://linux22.com/image/592911/%E5%9C%A8%20bash%20%E4%B8%AD%E4%BB%8E%20GitHub%20%E7%BD%91%E5%9D%80%E6%8F%90%E5%8F%96%E5%AD%98%E5%82%A8%E5%BA%93%E5%90%8D%E7%A7%B0.png)
给定任何 GitHub 存储库 URL 字符串,例如:
git://github.com/some-user/my-repo.git
或者
[email protected]:some-user/my-repo.git
或者
https://github.com/some-user/my-repo.git
从以下任何字符串中bash
提取存储库名称的最佳方法是什么?解决方案my-repo
必须适用于上面指定的所有类型的 URL。
谢谢。
答案1
$ url=git://github.com/some-user/my-repo.git
$ basename=$(basename $url)
$ echo $basename
my-repo.git
$ filename=${basename%.*}
$ echo $filename
my-repo
$ extension=${basename##*.}
$ echo $extension
git
答案2
我会选择basename $URL .git
。
答案3
老帖子,但我最近遇到了同样的问题。
该正则^(https|git)(:\/\/|@)([^\/:]+)[\/:]([^\/:]+)\/(.+).git$
表达式适用于这三种类型的 URL。
#!/bin/bash
# url="git://github.com/some-user/my-repo.git"
# url="https://github.com/some-user/my-repo.git"
url="[email protected]:some-user/my-repo.git"
re="^(https|git)(:\/\/|@)([^\/:]+)[\/:]([^\/:]+)\/(.+)(.git)*$"
if [[ $url =~ $re ]]; then
protocol=${BASH_REMATCH[1]}
separator=${BASH_REMATCH[2]}
hostname=${BASH_REMATCH[3]}
user=${BASH_REMATCH[4]}
repo=${BASH_REMATCH[5]}
fi
解释 (在 regex101 上查看实际操作):
^
匹配字符串的开头(https|git)
匹配并捕获字符https
或git
(:\/\/|@)
匹配并捕获字符://
或@
([^\/:]+)
匹配并捕获一个或多个不属于或/
不属于:
[\/:]
匹配一个字符是/
或者:
([^\/:]+)
/
匹配并捕获一个或多个非或的字符:
,再次[\/:]
匹配字符/
(.+)
匹配并捕获一个或多个字符(.git)*
匹配.git
末尾的可选后缀$
匹配字符串的结尾
这远非完美,因为类似的东西[email protected]:some-user/my-repo.git
会匹配,但我认为它足以进行提取。
答案4
使用正则表达式:/([^/]+)\.git$/