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

1

A idéia 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 repositórios my (hense username in perl regex) e trocá-los para usar ssh ao invés de http. Eu testei o script perl, ele está funcionando corretamente, mas quando eu o uso no comando ele gera isto

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

    
por user1685095 15.12.2016 / 14:34

1 resposta

0

Não sei exatamente o que você quer (qual é o comando exato esperado), mas isso:

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"}'

deve imprimir

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

(Altere o print para system se tiver certeza de que deseja executar os comandos)

Eu mudei o for r in xyz para inserir o URL: s no stdin do Perl, se você quiser dar a ele na linha de comando, você poderia fazer algo como

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

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

Além disso, melhor escapar do @ na string, já que é o sigil para uma variável de matriz.

    
por 15.12.2016 / 15:45