Учитывая ЛЮБУЮ строку URL-адреса репозитория GitHub, например:
git://github.com/some-user/my-repo.git
или
git@github.com:some-user/my-repo.git
или
https://github.com/some-user/my-repo.git
Как лучше всего в bash
извлечь имя репозитория my-repo
из любой из следующих строк? Решение ДОЛЖЕН работают для всех типов URL, указанных выше.
Спасибо.
$ 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
Я бы пошел с basename $URL .git
.
Старый пост, но недавно я столкнулся с той же проблемой.
Регулярное выражение ^(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="git@github.com: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
, буквально$
соответствует концу строкиЭто если далеко не идеально, как что-то вроде https@github.com:some-user/my-repo.git
подойдет, но я думаю, что для извлечения достаточно.
Подводя итоги:
Получить URL без суффикса (необязательно):
url_without_suffix="${url%.*}"
Получить имя репозитория:
reponame="$(basename "${url_without_suffix}")"
Потом получить имя пользователя (хоста):
hostname="$(basename "${url_without_suffix%/${reponame}}")"
использовать регулярное выражение: /([^/]+)\.git$/
basename $git_repo_url | tr -d ".git"
basename - мое любимое, но вы также можете использовать sed
:
url=git://github.com/some-user/my-repo.git
reponame="$(echo $url | sed -r 's/.+\/([^.]+)(\.git)?/\1/')"
# reponame = "my-repo"
"sed" удалит весь текст до последнего /
+ .git
расширение (если существует), и сохранит совпадение группы \1
это все, кроме точки ([^.]+)