나는 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에서는 대체가 불가능하므로 불가능합니다.
답변2
반복되는 문자가 있는 문자열과 일치합니다.기본 정규식:
$ echo 'AAAAAA======-----======AAAAAAAAA' | grep -o '\(.\)\1*'
AAAAAA
======
-----
======
AAAAAAAAA
.
모든 문자와 일치합니다. \(.\)
임의의 문자와 일치하고 해당 문자를 캡처 그룹 1에 저장합니다. \1*
동일한 문자가 다른 경우와 일치합니다.
\1
BRE는 다음과 같은 역참조 사용을 지원합니다.POSIX.