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 ). 여기서는 왼쪽 대괄호만 사용하고 있으며 오른쪽 대괄호를 찾을 수 없으며 오류가 발생합니다.\(
\)
n
1
9
\(
sed
(
BRE에서는 리터럴 여는 괄호 만 일치시키면 됩니다 .
일부 sed
구현에서는 다음으로 전환할 수 있습니다.확장 정규식(ERE)(예GNU sed옵션 포함 )이므로 리터럴 여는 괄호와 일치하도록 -r
사용해야 합니다 .\(
답변3
이런 이유입니다. 이 경우 괄호를 벗어나면 안 됩니다.
작은따옴표는 '
이미 쉘에 문자열 내용을 신경 쓰지 말라고 지시하므로 문자 그대로 sed에 전달됩니다. 이스케이프된 괄호는 sed에게 \)
끝을 하위 정규식의 구분 기호로 처리하라고 지시하는 것입니다.