이 sed 명령을 사용하여 문자열을 구문 분석하여my-team
echo 'origin [email protected]:my-team/myrepo.git (fetch)' | gsed "s/origin.*bitbucket.org\(:\)\(.*\)\/.*/\2/"
하지만 ":" 또는 "/"와 일치시키기 위해 OR 연산자를 사용하고 싶습니다. 내가 이해할 수 없는 오류가 발생합니다.
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,"
:?
:
두 문자( 또는 ) 중 하나가 항상 존재한다고 확신한다면 /
실제로는 그럴 필요가 없습니다.