\2
указывает на печать второго совпадения, если ваша цель — напечатать :my-team
(, неясно из вашего вопроса ), вы можете сделать это:
echo 'origin git@bitbucket.org:my-team/myrepo.git (fetch)' |\
gsed "s/origin.*bitbucket.org\(:.*\)\/.*/\1/"
Чтобы по-прежнему совпадать в случае наличия :
или /
, вы можете использовать группы, не соответствующие -. Вместо (<regex>)
они записываются как(:?<regex>)
:
echo 'origin git@bitbucket.org:my-team/myrepo.git (fetch)' |\
gsed -r "s/origin.*bitbucket.org(:?:|\/)(.*)\/.*/\2/"
Это даст my-team
для обоих:
Я думаю, что путаница возникает из-за того, что в sed для разделения команды вы можете использовать любой символ (часто вы будете видеть / )это требует, чтобы вы экранировали этот символ в регулярном выражении. Так что если вы не в курсе этого непонятно чего бежать. Если вы используете ,
вместо /
, этот символ не нужно экранировать :
echo 'origin git@bitbucket.org:my-team/myrepo.git (fetch)' |\
sed -r "s,origin.*bitbucket.org(:?:|/)(.*)\/.*,\2,"
И вам на самом деле не нужен :?
, если вы уверены, что один из двух символов(:
или/
)всегда будет присутствовать.
Что вам нужно сделать, так это заменить оболочку в файле /etc/passwd
на /usr/bin/passwd
или любой другой путь к вашей команде passwd
. Вы можете сделать это с помощью команды vipw
. Я не уверен, что chsh
позволит вам перейти на двоичный файл оболочки, отличный от -, в этом поле.
usermod -s
также ищет одобренную оболочку, а /bin/passwd
явно не одобренная оболочка.