
info
スクリプトに追加するパイピングのためにgitoliteコマンドの出力から名前をどのように抽出できますか?
すべてのリポジトリをgitoliteからGitlabサーバーに移行するための移行スクリプトを作成しています。だからgitoliteからすべてのリポジトリ名を取得し、Gitlabで使用したいと思います。以下は出力例合わせてみます。
hello sitaram, this is gitolite v2.1-29-g5a125fa running on git 1.7.4.4
the gitolite config gives you the following access:
R SecureBrowse
R W anu-wsd
R W entrans
@R W git-notes
@R W gitolite
R W gitolite-admin
R W indic_web_input
@C R W private/sitaram/[\w.-]+
R W proxy
@C @R W public/sitaram/[\w.-]+
@R_ @W_ testing
R W vic
次のように出力する必要があります。
SecureBrowse
anu-wsd
entrans
git-notes
gitolite
gitolite-admin
indic_web_input
proxy
testing
vkc
現在、私はこれを他の人が使用できるようにシェルスクリプトに入れようとしています。私の現在の方法はgrep
次のコマンドです。
grep -Eio "([A-Za-z0-9_-]+)$" gitolite-info-output
しかし、これは4
最初の行の終わりもキャプチャします。いくつかのアプローチを試しましたが、他のものを含めたり除外したりしないと正しく除外できないようです。
この方法OSX 10.10.3。
答え1
質問に表示した入力に基づいて、次のように機能します。
$ grep -oP '^[ @]*R.* \K.*' gitolite-info-output
SecureBrowse
anu-wsd
entrans
git-notes
gitolite
gitolite-admin
indic_web_input
proxy
testing
vic
これは、GNU grepの-P
スイッチを使用してPerl準拠の正規表現を有効にすることです。これは\K
「今まで一致するものを除外する」を提供します。結合すると、-o
ゼロ個以上のスペースまたは@
()で^[ @]*
始まり、R
ゼロ個以上の文字で始まり、他のスペースまで検索できます。\K
最後の単語だけが印刷されるため、これらの内容はすべて削除されます。
GNUがない場合grep
(たとえば、OSX)、次のことができます。
$ grep -E '^[ @]*R' gitolite-info-output | awk '{print $NF}'
SecureBrowse
anu-wsd
entrans
git-notes
gitolite
gitolite-admin
indic_web_input
proxy
testing
vic
またはすべてを完了するには、次の手順を実行しますawk
。
$ awk '/^[ @]*R/{print $NF}' gitolite-info-output
SecureBrowse
anu-wsd
entrans
git-notes
gitolite
gitolite-admin
indic_web_input
proxy
testing
vic
またはパール:
$ perl -nle '/^[ @]*R.*\s(.*)/ && print $1' gitolite-info-output
SecureBrowse
anu-wsd
entrans
git-notes
gitolite
gitolite-admin
indic_web_input
proxy
testing
vic