使用 POSIX 提取 git url 的域

Extracting git url's domain with POSIX

我正在尝试构建最可靠的方法来从 git 存储库中提取域。 对于像这样的网址:

ssh://git@gitlab.com:22411/usage/project_100.git
git://example.org/path/to/repo.git
https://github.com/example/foobar.git
http://github.com/example/foobar.git
ssh://user@host.com/path/to/repo.git
git://host.com/path/to/repo.git

我可以使用:

echo $url | awk -F[/:] '{print }'

但是对于像这样的回购:

"git@github.com:User/UserRepo.git"

不行。但以下内容确实如此:

echo $url | awk -v FS="(@|:)" '{print }'

是否有一些可靠的方法可以让我始终提取 POSIX 中的域?

您可以使用 sed 轻松做到这一点。

echo $url | sed -E 's/.*\:\/\/(.*)@?.*\:.*/ /' | awk -F@ '{print }'

Perl 版本:

perl -pe 's{.*//([^/]+@)?([^:/]+).*}{}' input-file

如果 URL 包含 ://,您知道要删除协议,然后从第一个 / 开始删除所有内容。否则,如果它包含 @,则假定它是您的第二种情况,并删除包括 @ 在内的所有内容,然后删除从 : 开始的所有内容。其他情况可以根据需要添加。

url="..."
case $url in
  *://*)
    domain=${url#*://}
    domain=${domain#*@}
    domain=${domain%%/*}
    ;;
  *@*:*)
    domain=${url#*@}
    domain=${domain%%:*}
    ;;
 esac

用sed。我从 s/// 切换到 s|||

sed 's|.*//||; s|.*@||; s|/.*||; s|:.*||' file

输出:

gitlab.com
example.org
github.com
github.com
host.com
host.com