So gleichen Sie Zeichenfolgen mit regulären Ausdrücken ab und führen bedingt Aktionen mit Erfassungsgruppen aus

So gleichen Sie Zeichenfolgen mit regulären Ausdrücken ab und führen bedingt Aktionen mit Erfassungsgruppen aus

Die Idee hier ist, Remotes in allen Git-Repositories von http auf ssh umzustellen

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

Ich möchte alle meine (daher Benutzername in Perl-Regex) Repositories finden und sie so umstellen, dass sie SSH statt HTTP verwenden. Ich habe das Perl-Skript getestet, es funktioniert einwandfrei, aber wenn ich es in einem Befehl verwende, gibt es Folgendes aus:

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

Antwort1

Ich bin nicht ganz sicher, was Sie wollen (was der genaue erwartete Befehl ist), aber dies:

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

sollte drucken

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

(Ändern Sie das printin system, wenn Sie sicher sind, dass Sie die Befehle ausführen möchten.)


Ich habe die for r in xyzEingabe der URLs in Perls Standardeingabe geändert. Wenn Sie sie auf der Kommandozeile eingeben möchten, können Sie Folgendes tun:

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

um das Befehlszeilenargument zu löschen $_(das implizit von verwendet wird, m//sofern Sie nicht mit etwas anderes angeben $var =~ m//).

Außerdem ist es besser, das @in der Zeichenfolge zu maskieren, da es das Siegel für eine Array-Variable ist.

verwandte Informationen