Cómo hacer coincidir una cadena con expresiones regulares y hacer cosas condicionalmente con grupos de captura

Cómo hacer coincidir una cadena con expresiones regulares y hacer cosas condicionalmente con grupos de captura

La idea aquí es cambiar los controles remotos de http a ssh en todos los repositorios de 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`}"

Lo que quiero hacer es encontrar todos mis repositorios (por lo tanto, nombre de usuario en Perl Regex) y cambiarlos para que usen ssh en lugar de http. Probé el script Perl, funciona correctamente, pero cuando lo uso en el comando genera esto

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

Respuesta1

No estoy exactamente seguro de lo que quiere (cuál es el comando esperado exacto), pero esto:

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

debería imprimir

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

(Cambie printa systemsi está seguro de que desea ejecutar los comandos)


Cambié for r in xyzpara ingresar las URL a la entrada estándar de Perl, si desea ingresarlas en la línea de comando, puede hacer algo como

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

para soltar el argumento de la línea de comando $_(que se usa implícitamente m//a menos que especifique algo más con $var =~ m//).

Además, es mejor escapar de @la cadena, ya que es el sigilo de una variable de matriz.

información relacionada