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

\22番目の一致を印刷することを意味します。目標が印刷されている場合: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,"

:?:2つの文字(または)のいずれかが常に存在すると確信している場合は、/実際には必要ありません。

関連情報