정규식(기본 정규식만 해당)을 사용하여 grep에서 교대를 달성하는 방법은 무엇입니까?

정규식(기본 정규식만 해당)을 사용하여 grep에서 교대를 달성하는 방법은 무엇입니까?

나는 ERE(확장 정규 표현식)만 사용할 수 있기 때문에 이 질문이 별로 의미가 없다는 것을 알고 있습니다. 그러나 당분간은 교체를 구현하는 것이 유일한 선택입니다. BRE만 사용하여 어떻게 구현할 수 있나요? 아니면 해결 방법을 찾아야 합니까?

다음 문자열이 있다고 가정해 보겠습니다.

AAAAAA======-----======AAAAAAAAA

이제 내 목표는 기본 정규식만 사용하여 AAAAA, ======, -----, ====== 및 AAAAAAAAA를 각각 일치시키는 것입니다. 이는 ERE를 사용하여 빠르게 수행할 수 있지만 BRE로만 이를 수행하는 방법을 알고 싶습니다. 지금까지 서로 일치하는 일부 문자열이 서로 겹치지 않고(예: "AAAAA=="와 일치하는 정규식은 발생하지 않아야 함) 이 작업을 수행하는 적절한 방법을 찾을 수 없습니다.

답변1

간단하다: 그게 다야아니요BRE는번갈아

POSIX BRE는 다른 기능을 지원하지 않습니다. 대체도 지원되지 않습니다.

귀하의 기본 목표:

이제 내 목표는...각각...기본 정규 표현식과 일치시키는 것입니다.

BRE를 사용할 수 있습니다:

$ str='AAAAAA======-----======AAAAAAAAA'
$ echo "$str" | grep -Eo '(.)\1*'
AAAAAA
======
-----
======
AAAAAAAAA

또는 BRE grep에서 여러 패턴을 사용할 수도 있습니다.

$ echo "$str" | grep -o -e 'AA*' -e '--*' -e '==*'
AAAAAA
======
-----
======
AAAAAAAAA

또는 솔루션을 GNU grep으로 제한하십시오( \|BRE 구문에서도 교대가 허용됩니다. 이는 유효한 POSIX 기능이 아닙니다).

$ echo "$str" | grep -o '\(AA*\)\|\(==*\)\|\(--*\)'

하지만 두 번째 목표는 다음과 같습니다.

추가로 별도의 캡처 그룹에 넣을 수 있나요?

그냥 물어봐하나정규식이며 BRE에서는 대체가 불가능하므로 불가능합니다.

BRE의 교대에 대한 좋은 설명

답변2

반복되는 문자가 있는 문자열과 일치합니다.기본 정규식:

$ echo 'AAAAAA======-----======AAAAAAAAA' | grep -o '\(.\)\1*'
AAAAAA
======
-----
======
AAAAAAAAA

.모든 문자와 일치합니다. \(.\)임의의 문자와 일치하고 해당 문자를 캡처 그룹 1에 저장합니다. \1*동일한 문자가 다른 경우와 일치합니다.

\1BRE는 다음과 같은 역참조 사용을 지원합니다.POSIX.

관련 정보