"브래킷 불균형"을 탈출하더라도?

"브래킷 불균형"을 탈출하더라도?

sed이 간단한 명령을 실행하려고 합니다.

sed '/VALUES\ \([0-9]/d!'

여전히 오류가 발생합니다 "RE error: parentheses not balanced"(예, 따옴표가 있습니다).

어떡해? 다른 것을 추가할 수 있지만 )정규식과 일치하지 않는다는 뜻입니다.

답변1

이스케이프 문자에는 (특별한 의미가 있습니다 sed.역참조. 리터럴을 일치시키려면 (백슬래시 없이 사용하세요./VALUES ([0-9]/d!

일치시키려는 경우 \(다음을 이스케이프하세요 \.\\(

탈출 (공간)은 아무런 차이가 없습니다.

답변2

기본적으로 sed다음을 사용합니다 .기본 정규식(BRE). BRE에서는 정의하는 \(\)사용됩니다 .하위 표현식:

문자 쌍 "(" 및 ")" 사이에 하위 표현식을 묶어서 BRE에서 하위 표현식을 정의할 수 있습니다. 이러한 하위 표현식은 하위 표현식 내 고정이 선택적 동작이 아닌 한 "(" 및 ")" 없이 일치하는 모든 항목과 일치해야 합니다. BRE 표현식 고정을 참조하세요. 하위 표현식은 임의로 중첩될 수 있습니다.

그런 다음 역참조 표현식을 사용하여 '\n'and 사이에 포함된 하위 표현식과 일치하는 동일한(비어 있을 수도 있음) 문자열을 일치시킬 수 있습니다(여기서 from to ). 여기서는 왼쪽 대괄호만 사용하고 있으며 오른쪽 대괄호를 찾을 수 없으며 오류가 발생합니다.\(\)n19\(sed

(BRE에서는 리터럴 여는 괄호 만 일치시키면 됩니다 .

일부 sed구현에서는 다음으로 전환할 수 있습니다.확장 정규식(ERE)(예GNU sed옵션 포함 )이므로 리터럴 여는 괄호와 일치하도록 -r사용해야 합니다 .\(

답변3

이런 이유입니다. 이 경우 괄호를 벗어나면 안 됩니다.

작은따옴표는 '이미 쉘에 문자열 내용을 신경 쓰지 말라고 지시하므로 문자 그대로 sed에 전달됩니다. 이스케이프된 괄호는 sed에게 \)끝을 하위 정규식의 구분 기호로 처리하라고 지시하는 것입니다.

관련 정보