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

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

예를 들어, 다음은 구문 상 올바르지 않습니다.

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

그러나 이것은 이다 syntatically 올바른 :

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

정규식으로 이스케이프해야하는 문서와 그렇지 않은 문서에 대한 문서가 있습니까?



답변

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

쉘의 경우 ( POSIX 스펙에서 ) :

인용은 특정 문자 나 단어가 셸에서 특수한 의미를 제거하는 데 사용됩니다. 인용은 다음 단락에서 특수 문자의 문자 적 ​​의미를 보존하고 예약어가 인식되지 않도록하며 여기 문서 처리 내에서 매개 변수 확장 및 명령 대체를 방지하는 데 사용할 수 있습니다 (여기 문서 참조).

응용 프로그램은 다음 문자가 자신을 나타내는 경우 인용해야합니다.

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

특정 상황에서 다음을 인용해야 할 수도 있습니다. 즉,이 문자는이 볼륨의 IEEE Std 1003.1-2001에 설명 된 조건에 따라 특별 할 수 있습니다.

*   ?   [   #   ˜   =   %

다양한 인용 메커니즘은 이스케이프 문자, 작은 따옴표 및 큰 따옴표입니다. 이 문서는 다른 형태의 인용을 나타냅니다. 여기 문서를 참조하십시오.

특정 프로그램 (regexes, perl, awk 사용)은 탈출에 대한 추가 요구 사항이있을 수 있습니다.


답변

각 애플리케이션에는 고유 한 ‘특수’문자 세트가 있습니다. 당신이 겪은 문제 grep는 껍질 이 아닙니다. 에서 인용 할 문자 grep는 “정규 표현”에 대한 맨 페이지 섹션을 참조하십시오.

쉘의 경우 인용해야 할 문자는 다음과 같습니다.

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

그리고 여백.

쉘에 따라 다른 문자도 인용해야 할 수 있습니다.

!^%

쉘 맨 페이지의 “SHELL GRAMMAR”을보십시오.


답변

여러 유형의 정규 표현식이 있으며 특수 문자 세트는 특정 유형에 따라 다릅니다. 그들 중 일부는 아래에 설명되어 있습니다. 모든 경우에 특수 문자는 백 슬래시로 이스케이프됩니다 \. 예를 들어 [당신이 \[대신 쓰는 것을 일치 시킵니다. 또는 ^대괄호 사이에 문자 를 하나씩 넣어서 문자 (제외 )를 이스케이프 처리 할 수 ​​있습니다 [[].

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

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

기본 정규 표현식 (BRE)

  • POSIX : 기본 정규 표현식
  • 명령 : grep,sed
  • 특수 문자: .[\
  • 일부 상황에서는 특별합니다. *^$
  • 문자열을 탈출 : "$(printf '%s' "$string" | sed 's/[.[\*^$]/\\&/g')"

확장 정규식 (ERE)

  • POSIX : 확장 정규 표현식
  • 명령 : grep -E, GNU : sed -r, * BSD :sed -E
  • 특수 문자: .[\(
  • 일부 상황에서는 특별합니다. *^$)+?{|
  • 문자열을 탈출 : "$(printf '%s' "$string" | sed 's/[.[\*^$()+?{|]/\\&/g')"

답변

grep정규식으로 BRE를 사용합니다. 그것은 좋은 문서가 여기에 일반적인 개요는 “그 문자를 얻을 수있는 특수 문자 또는 메타 문자를 이스케이프 시퀀스 (만들 탈출 할 것 \n, \r이것은 예를 들어, 항상 사실이 아니다 있지만, 등)”, 당신은에 있습니다 탈출 (하고 )그들의 특별한 의미를 얻는다 (역 참조).


답변

쉘은 명령 실행 전에 명령 행을 변환 할 수 있습니다. 쉘과 grep따옴표를 사용하여 일부 문자의 특수 의미를 제거 할 수 있습니다. 그럼에도 불구 grep하고 껍질에는 다른 특수 문자가 있습니다. 또한 기존 확장으로 생성되지 않은 이스케이프 처리되지 않은 특수 문자는 명령 실행 전에 셸에서 제거됩니다.

echo '[]' | grep '[]'

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

echo '[]' | grep \[]

위와 비슷한 사례를 볼 수 있습니다. 백 슬래시는 제거되고 []에 인수로 전송됩니다 grep. grep조작 된 대괄호 표현식을 인식합니다.

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

마지막으로이 경우 따옴표는 셸에서 제거되고 \[]인수로 전송 grep되지만이 특정 경우 ¹ 는 리터럴 괄호로 \[해석됩니다 grep. 쉘에서 백 슬래시를 특수 문자로 해석하지 못하게하려면 따옴표가 필요합니다.


¹ POSIX 사양 .


답변