답변:
응용 프로그램에 따라 다릅니다. 귀하의 예 [
에서에 대한 인수로 인용해야 grep
하지만 그렇지 않습니다 echo
.
쉘의 경우 ( POSIX 스펙에서 ) :
인용은 특정 문자 나 단어가 셸에서 특수한 의미를 제거하는 데 사용됩니다. 인용은 다음 단락에서 특수 문자의 문자 적 의미를 보존하고 예약어가 인식되지 않도록하며 여기 문서 처리 내에서 매개 변수 확장 및 명령 대체를 방지하는 데 사용할 수 있습니다 (여기 문서 참조).
응용 프로그램은 다음 문자가 자신을 나타내는 경우 인용해야합니다.
| & ; < > ( ) $ ` \ " ' <space> <tab> <newline>
특정 상황에서 다음을 인용해야 할 수도 있습니다. 즉,이 문자는이 볼륨의 IEEE Std 1003.1-2001에 설명 된 조건에 따라 특별 할 수 있습니다.
* ? [ # ˜ = %
다양한 인용 메커니즘은 이스케이프 문자, 작은 따옴표 및 큰 따옴표입니다. 이 문서는 다른 형태의 인용을 나타냅니다. 여기 문서를 참조하십시오.
특정 프로그램 (regexes, perl, awk 사용)은 탈출에 대한 추가 요구 사항이있을 수 있습니다.
여러 유형의 정규 표현식이 있으며 특수 문자 세트는 특정 유형에 따라 다릅니다. 그들 중 일부는 아래에 설명되어 있습니다. 모든 경우에 특수 문자는 백 슬래시로 이스케이프됩니다 \
. 예를 들어 [
당신이 \[
대신 쓰는 것을 일치 시킵니다. 또는 ^
대괄호 사이에 문자 를 하나씩 넣어서 문자 (제외 )를 이스케이프 처리 할 수 있습니다 [[]
.
^
(하위) 표현식의 시작 부분에서 special 과 같은 일부 컨텍스트에서 특수한 문자 는 모든 컨텍스트에서 이스케이프 될 수 있습니다.
다른 사람들이 쓴 것처럼 : 쉘에서 작은 따옴표 사이에 표현식을 묶지 않으면 이미 이스케이프 된 정규 표현식에서 쉘의 특수 문자를 이스케이프해야합니다. 예 : 대신 bash와 같은 Bourne 호환 쉘에서 (또는 : 또는 ) '\['
쓸 수 있지만 이것은 또 다른 이야기입니다.\\[
"\["
"\\["
grep
,sed
.[\
*^$
"$(printf '%s' "$string" | sed 's/[.[\*^$]/\\&/g')"
grep -E
, GNU : sed -r
, * BSD :sed -E
.[\(
*^$)+?{|
"$(printf '%s' "$string" | sed 's/[.[\*^$()+?{|]/\\&/g')"
쉘은 명령 실행 전에 명령 행을 변환 할 수 있습니다. 쉘과 grep
따옴표를 사용하여 일부 문자의 특수 의미를 제거 할 수 있습니다. 그럼에도 불구 grep
하고 껍질에는 다른 특수 문자가 있습니다. 또한 기존 확장으로 생성되지 않은 이스케이프 처리되지 않은 특수 문자는 명령 실행 전에 셸에서 제거됩니다.
echo '[]' | grep '[]'
쉘은 인수 []
를 전달하고에 grep
의해 형식이 잘못된 대괄호 표현식으로 구문 분석됩니다 grep
.
echo '[]' | grep \[]
위와 비슷한 사례를 볼 수 있습니다. 백 슬래시는 제거되고 []
에 인수로 전송됩니다 grep
. grep
조작 된 대괄호 표현식을 인식합니다.
echo '[]' | grep '\[]'
마지막으로이 경우 따옴표는 셸에서 제거되고 \[]
인수로 전송 grep
되지만이 특정 경우 ¹ 는 리터럴 괄호로 \[
해석됩니다 grep
. 쉘에서 백 슬래시를 특수 문자로 해석하지 못하게하려면 따옴표가 필요합니다.
¹ POSIX 사양 .
bash
포함 된 일부 쉘 ( 포함)!
은 여전히 큰 따옴표로 확장되며 작은 따옴표 만 확장을 중지하거나 쉘 옵션을 해제합니다.