Como combinar string com regexp e fazer coisas condicionalmente com grupos de captura

Como combinar string com regexp e fazer coisas condicionalmente com grupos de captura

A ideia aqui é mudar os controles remotos de http para ssh em todos os repositórios git

find / -type d -name '.git' 2>/dev/null | xargs -I {} $SHELL -c \
'cd $(dirname {}) && echo $(pwd) > /tmp/log.log && git remote | \
perl -ne "if (`git config --get remote.$_.url` =~ m#https://(.*)/(username.*)#){`git remote remove $_ && git remote add $_ git\@$1:$2`}"

O que eu quero fazer é encontrar todos os meus repositórios (nome de usuário em perl regex) e trocá-los para usar ssh em vez de http. Eu testei o script perl, ele está funcionando corretamente, mas quando eu o uso no comando ele gera isso

fatal: No such remote: remote syntax error at -e line 1, near "( =~" syntax error at -e line 1, near ";}" Execution of -e aborted due to compilation errors. xargs: /bin/zsh: exited with status 255; aborting

Responder1

Não tenho certeza do que você deseja (qual é o comando exato esperado), mas isto:

printf "%s\n" 'https://github.com/username/reponame.git' \
 '[email protected]:username/reponame' | perl -lne \
'if (m#https://(.*?)/(.*/)#) {print "git remote remove $_ && git remote add $_ git\@$1:$2"}'

deveria imprimir

git remote remove https://github.com/username/reponame.git && git remote add https://github.com/username/reponame.git [email protected]:username/

(Altere printpara systemse tiver certeza de que deseja executar os comandos)


Eu mudei for r in xyzpara inserir os URL:s para stdin do Perl, se você quiser fornecê-los na linha de comando, você pode fazer algo como

perl -le '$_=shift; if (m#http://(.*?)/(.*/)#) {print "blah $_ $1:$2"}' http://foo.bar/user/something

para descartar o argumento da linha de comando $_(que é usado implicitamente, m//a menos que você especifique outra coisa com $var =~ m//).

Além disso, é melhor escapar do @na string, pois é o sigilo de uma variável de array.

informação relacionada