$ 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
Dada QUALQUER string de url do repositório GitHub como:
git://github.com/some-user/my-repo.git
ou
[email protected]:some-user/my-repo.git
ou
https://github.com/some-user/my-repo.git
Qual é a melhor maneira de bash
extrair o nome do repositório my-repo
de qualquer uma das seguintes sequências? A solução DEVE funcionar para todos os tipos de URLs especificados acima.
Obrigado.
Eu iria com basename $URL .git
.
Resumindo:
Obter url sem sufixo (opcional):
url_without_suffix="${url%.*}"
Obter nome do repositório:
reponame="$(basename "${url_without_suffix}")"
Obtenha o nome do usuário (host) depois:
hostname="$(basename "${url_without_suffix%/${reponame}}")"
Post antigo, mas enfrentei o mesmo problema recentemente.
O regex ^(https|git)(:\/\/|@)([^\/:]+)[\/:]([^\/:]+)\/(.+).git$
funciona para os três tipos de 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
Explaination ( veja em ação no regex101 ):
^
corresponde ao início de uma string (https|git)
corresponde e captura os caracteres https
ou git
(:\/\/|@)
corresponde e captura os caracteres ://
ou @
([^\/:]+)
corresponde e captura um caractere ou mais que não é /
nem :
[\/:]
corresponde a um caractere que é /
ou :
([^\/:]+)
corresponde e captura um caractere ou mais que não é /
nem :
, mais uma vez [\/:]
corresponde ao caractere /
(.+)
corresponde e captura um caractere ou mais .git
corresponde a .git
, literalmente $
corresponde ao final de uma string Isso está longe de ser perfeito, já que algo como [email protected]:some-user/my-repo.git
seria compatível, mas acho que é bom o suficiente para extração.
usa expressões regulares: /([^/]+)\.git$/
basename $git_repo_url | tr -d ".git"