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.