如何从 gitoliteinfo
命令输出中提取名称,以便进一步通过管道传输到脚本中?
我正在编写一个迁移脚本,将我的所有存储库从 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
目前我正在尝试将其放入 shell 脚本中,以便其他人可以使用。我当前的方法是一个grep
命令,如下所示:
grep -Eio "([A-Za-z0-9_-]+)$" gitolite-info-output
但是,这也捕获了4
第一行末尾的 。我一直在尝试几种方法,但我似乎无法在不包含或排除其他内容的情况下正确排除它。
这样做操作系统 X 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
,我们可以搜索以 0 个或多个空格或@
( ^[ @]*
) 开头的行,然后是R
,然后是 0 个或多个字符,直到另一个空格。所有这些都被丢弃,因为\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:
$ perl -nle '/^[ @]*R.*\s(.*)/ && print $1' gitolite-info-output
SecureBrowse
anu-wsd
entrans
git-notes
gitolite
gitolite-admin
indic_web_input
proxy
testing
vic