일반적으로 정규식에서 어떤 문자를 이스케이프해야합니까?
예를 들어, 다음은 구문 상 올바르지 않습니다.
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 사양 .