RE에 \1이 정의되어 있지 않습니까?

RE에 \1이 정의되어 있지 않습니까?

내 코드는 다음과 같습니다

cat file.ign | sed 's/^([^A-Za-z0-9]+ )/<ignore>\1<\/ignore>/g'

하지만 오류 메시지가 나타납니다.

sed: 1: "s/^([^A-Za-z0-9]+ )/<ig ...": \1 not defined in the RE

답변1

괄호는 BRE(기본 정규 표현식) 구문의 리터럴입니다. 캡처 그룹을 나타내려면 다음과 같이 이스케이프해야 합니다 \(.\)

또한 @BenjaminW의 의견에서 지적했듯이 +BRE에서는 문자 그대로입니다. GNU sed는 \+BRE에서 수량자로 지원됩니다.

sed 's/^\([^A-Za-z0-9]\+ \)/<ignore>\1<\/ignore>/g'

(그러나 다른 구현에서는 그렇지 않을 수도 있습니다). 또는 적절하게 또는 명령줄 스위치를 사용하여 확장 정규식(ERE) 모드를 켭니다 -E(해당 버전의 설명서를 확인하세요).-r

sed -E 's/^([^A-Za-z0-9]+ )/<ignore>\1<\/ignore>/g'

또는 POSIX 호환 수량자를 사용하세요.\{1,\}

sed 's/^\([^A-Za-z0-9]\{1,\} \)/<ignore>\1<\/ignore>/g'

ASIDE (전역 대체) 수정자는 표현식이 패턴의 시작 부분에 고정되어 있으므로 g여기서는 아무런 효과가 없습니다 (한 줄에 한 번만 발생할 수 있음).^

답변2

사용GNU sed, as 를 호출하거나 sed -E괄호를 이스케이프 처리하여 역참조가 작동하도록 할 수 있지만 GNU sed를 사용하지 않는 경우 역참조에 의존할 수 없습니다.POSIX sed아니요(하지만)는 ERE(확장 정규 표현식)의 -E또는 매개변수를 지원하지 않으며 -rGNU의 BRE(기본 정규 표현식) 백슬래시 표기법도 지원하지 않습니다. (여기있어POSIX ERE 및 BRE에 대한 추가 정보, GNU의 BRE 구현, ERE로의 이스케이프를 허용하는 기능에 대해 심도있게 논의하지는 않습니다. )

다행히도 (이 경우) ERE가 필요하지 않습니다. 이것은 당신에게 도움이 될 것입니다:

sed 's/^[^A-Za-z0-9][^A-Za-z0-9]* /<ignore>&<\/ignore>/' file.ign

BRE는 수량자를 지원하지 않으므로 +"1"을 요청한 다음 "0 이상"을 요청하여 비단어 문자 집합을 두 배로 늘려 "1 이상"으로 만들어야 합니다. 앰퍼샌드( &)는 전체 일치 항목을 나타냅니다. 이 경우 모든 것을 묶을 필요는 없습니다. (줄 시작 앵커의 ^너비는 0이므로 여기서는 중요하지 않습니다.)

cat불필요해서 제거했습니다 . 또한 앵커는 한 줄에 한 번만 일치할 수 있음을 의미하므로 /g수정자를 제거했습니다 . 따라서 두 번째 일치 항목을 얻을 수 없으므로 전역 교체는 아무 작업도 수행하지 않습니다.^

관련 정보