gnu sed 尝试对组使用 OR 运算符但不起作用

gnu sed 尝试对组使用 OR 运算符但不起作用

我使用这个 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,"

:?如果您确定两个字符(:/)之一将始终存在,您实际上不需要。

相关内容