Как сопоставить строку с регулярным выражением и условно выполнять действия с группами захвата

Как сопоставить строку с регулярным выражением и условно выполнять действия с группами захвата

Идея здесь в том, чтобы изменить удаленные соединения с http на ssh во всех репозиториях 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`}"

Я хочу найти все мои (имя пользователя в регулярном выражении perl) репозитории и переключить их на использование ssh вместо http. Я протестировал скрипт perl, он работает нормально, но когда я использую его в команде, он выводит это

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

решение1

Я не совсем уверен, чего вы хотите (какая именно команда ожидается), но вот это:

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

следует напечатать

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

(Измените printна system, если вы уверены, что хотите выполнить команды)


Я изменил for r in xyzввод URL-адресов в stdin Perl. Если вы хотите передать их в командной строке, вы можете сделать что-то вроде

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

чтобы удалить аргумент командной строки $_(который неявно используется, m//если вы не укажете что-то другое с помощью $var =~ m//).

Кроме того, лучше экранировать символ @в строке, так как это сигил для переменной массива.

Связанный контент