gnu sed가 그룹에서 OR 연산자를 사용하려고 시도하지만 작동하지 않습니다.

gnu sed가 그룹에서 OR 연산자를 사용하려고 시도하지만 작동하지 않습니다.

이 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,"

:?:두 문자( 또는 ) 중 하나가 항상 존재한다고 확신한다면 /실제로는 그럴 필요가 없습니다.

관련 정보