我使用这个 sed 命令来解析字符串以获取my-team
echo 'origin [email protected]:my-team/myrepo.git (fetch)' | gsed "s/origin.*bitbucket.org\(:\)\(.*\)\/.*/\2/"
但我想使用或运算符来匹配“:”或“/”。它抛出一个我不明白的错误:
echo 'origin [email protected]:my-team/myrepo.git (fetch)' | gsed -r "s/origin.*bitbucket.org\(:|\/\)\(.*\)\/.*/\2/"
gsed: -e expression #1, char 45: invalid reference \2 on `s' command's RHS
gsed版本:
gsed --version
gsed (GNU sed) 4.7
答案1
\2
表示打印第二个匹配项,如果您的目标是打印:my-team
(从您的问题中不清楚),那么您可以执行以下操作:
echo 'origin [email protected]:my-team/myrepo.git (fetch)' |\
gsed "s/origin.*bitbucket.org\(:.*\)\/.*/\1/"
:
要在存在或的情况下仍然匹配, /
您可以使用非匹配组。而不是(<regex>)
这些写成(:?<regex>)
:
echo 'origin [email protected]:my-team/myrepo.git (fetch)' |\
gsed -r "s/origin.*bitbucket.org(:?:|\/)(.*)\/.*/\2/"
这将为my-team
两者产生:
我认为造成混乱的原因是在 sed 中,要分隔命令,您可以使用任何字符(通常您会看到 /),这要求您在正则表达式中转义该字符。因此,如果您没有意识到这一点,就不清楚要逃避什么。如果你使用,
而不是,/
那么这个字符不需要转义:
echo 'origin [email protected]:my-team/myrepo.git (fetch)' |\
sed -r "s,origin.*bitbucket.org(:?:|/)(.*)\/.*,\2,"
:?
如果您确定两个字符(:
或/
)之一将始终存在,您实际上不需要。