정규식에서 어떤 문자를 이스케이프해야 합니까?

정규식에서 어떤 문자를 이스케이프해야 합니까?

일반적으로 정규식에서 이스케이프 처리해야 하는 문자는 무엇입니까?

예를 들어, 다음은 문법적으로 올바르지 않습니다.

echo '[]' | grep '[]'
grep: Unmatched [ or [^

그러나 이구문이 정확합니다.

echo '[]' | grep '\[]'
[]

정규식에서 어떤 문자를 이스케이프해야 하고 어떤 문자를 이스케이프하면 안 되는지에 대한 문서가 있나요?

답변1

정규식에는 다양한 유형이 있으며 특수 문자 세트는 특정 유형에 따라 다릅니다. 그 중 일부는 아래에 설명되어 있습니다. 모든 경우에 특수 문자는 백슬래시로 이스케이프됩니다 \. 예를 들어, [당신이 쓴 것과 일치하도록 \[. 또는 ^문자(제외)를 하나씩 대괄호로 묶어 이스케이프할 수 있습니다 (예: ) [[].

일부 컨텍스트에서 특수한 문자(예: ^(하위)식의 시작 부분에 있는 문자)는 모든 컨텍스트에서 이스케이프될 수 있습니다.

다른 사람들이 쓴 것처럼: 셸에서 표현식을 작은따옴표로 묶지 않으면 이스케이프된 정규 표현식에서 셸의 특수 문자를 추가로 이스케이프해야 합니다. 예: bash 와 같은 Bourne 호환 쉘에서 '\['작성할 수 \\[있지만 "\["이는 또 다른 이야기입니다."\\["

기본 정규식(BRE)

  • POSIX: 기본 정규 표현식
  • 주문하다: grep,sed
  • 특수 문자:.[\
  • 특히 어떤 경우에는:*^$
  • 이스케이프 문자열:"$(printf '%s' "$string" | sed 's/[.[\*^$]/\\&/g')"

확장 정규식(ERE)

  • POSIX: 확장 정규식
  • 명령: grep -E, sed -E(이전 GNU 버전: sed -r)
  • 특수 문자:.[\(
  • 특히 어떤 경우에는:*^$+?{|
  • 이스케이프 문자열:"$(printf '%s' "$string" | sed 's/[.[\(*^$+?{|]/\\&/g')"

답변2

응용 프로그램에 따라 다릅니다. 귀하의 예에서는 [매개변수로 인용해야 grep하지만 그렇지 않습니다 echo.

쉘의 경우(에서POSIX 사양):

따옴표는 특정 문자나 단어의 특별한 의미를 쉘에서 제거하는 데 사용됩니다. 따옴표를 사용하면 다음 단락에서 특수 문자의 문자 그대로의 의미를 보존하고, 예약어가 예약어로 인식되는 것을 방지하고, 여기 문서 처리 시 매개변수 확장 및 명령 대체를 방지할 수 있습니다(여기 문서 참조).

애플리케이션이 자신을 나타내려면 다음 문자를 인용해야 합니다.

|  &  ;  <  >  (  )  $  `  \  "  '  <space>  <tab>  <newline>

어떤 경우에는 다음 사항을 인용해야 할 수도 있습니다. 즉, 이러한 문자는 IEEE Std 1003.1-2001의 이 볼륨에 설명된 조건에 따라 특별할 수 있습니다.

*   ?   [   #   ˜   =   %

다양한 인용 메커니즘에는 이스케이프 문자, 작은따옴표 및 큰따옴표가 포함됩니다. 여기 문서는 대체 인용 형식을 나타냅니다. 여기 문서를 참조하세요.

특정 프로그램(정규식, Perl, awk 사용)에는 이스케이프를 위한 추가 요구 사항이 있을 수 있습니다.

답변3

각 응용 프로그램에는 고유한 "특수" 문자 집합이 있습니다. 발생한 문제는 grep쉘과 관련이 없습니다. 에서 어떤 문자를 인용해야 하는지에 대한 자세한 내용은 grep맨페이지의 "정규 표현식" 섹션을 읽어보세요.

셸의 경우 따옴표로 묶어야 하는 문자는 다음과 같습니다.

;'"`#$&*?[]<>{}\

그리고 공백.

셸에 따라 다른 문자를 따옴표로 묶어야 할 수도 있습니다.

!^%

"SHELL GRAMMAR"에 대한 쉘 매뉴얼 페이지를 확인하십시오.

답변4

쉘은 명령줄을 실행하기 전에 명령줄을 변환할 수 있습니다. 쉘과 grep따옴표를 사용하여 특정 문자의 특별한 의미를 제거할 수 있습니다. 그래도 grep껍질에는 다양한 특수 문자가 있습니다. 또한 셸은 명령을 실행하기 전에 기존 확장으로 인해 발생하지 않는 이스케이프 처리되지 않은 특수 문자를 제거합니다.

echo '[]' | grep '[]'

인수는 쉘 []에 전달되고 grep잘못된 형식의 대괄호 표현식으로 구문 분석됩니다 grep.

echo '[]' | grep \[]

위에서도 비슷한 사례를 볼 수 있습니다. 백슬래시가 제거되고 에 []인수로 전달됩니다 grep. grep잘못된 대괄호 표현식을 식별합니다.

echo '[]' | grep '\[]'

마지막으로, 이 경우 따옴표는 쉘에 의해 제거되고 but \[]에 인수로 전달됩니다 grep. 이 특별한 경우에는 리터럴 대괄호로 \[해석됩니다 . grep쉘이 백슬래시를 특수 문자로 해석하지 않도록 하려면 따옴표가 필요합니다.


^POSIX 사양.

관련 정보