次のような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
次の文字列のどれから?ソリューション[〜#〜] must [〜#〜]は、上記で指定されたすべてのタイプの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$
は、3種類の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
に一致してキャプチャします(:\/\/|@)
は、文字://
または@
に一致してキャプチャします([^\/:]+)
は、/
でも:
でもない1文字以上に一致してキャプチャします[\/:]
は、isである1文字と一致します/
または:
([^\/:]+)
は、/
でも:
でもない1つ以上の文字と一致し、それでもキャプチャします[\/:]
は文字/
に一致します(.+)
は1文字以上に一致してキャプチャします.git
一致....git
、文字通り$
は文字列の末尾に一致します[email protected]:some-user/my-repo.git
のようなものが一致するので、これは完全とは程遠いですが、抽出には十分だと思います。
要約:
(オプションの)サフィックスのないURLを取得します:
url_without_suffix="${url%.*}"
リポジトリ名を取得:
reponame="$(basename "${url_without_suffix}")"
後でユーザー(ホスト)名を取得します。
hostname="$(basename "${url_without_suffix%/${reponame}}")"
basename $git_repo_url | tr -d ".git"
正規表現を使用:/([^/]+)\.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
を除くすべてのグループ([^.]+)
の一致を保持します