GNU Grep의 일부 패턴은 괄호로 묶일 수 있지만 다른 패턴은 그렇지 않다는 것을 알 수 있습니다. 예를 들어, 단어 시작 부분 일치는 단어가 따옴표로 묶인 경우에만 작동합니다.
user@host:~/Desktop$ grep -E '\<H' test
Hello World
user@host:~/Desktop$ grep -E \<H test
[테스트에는 Hello World 문자열이 포함되어 있습니다.]
그러나 파일의 끝과 시작을 일치시키는 데는 비용이 필요하지 않습니다.
user@host:~/Desktop$ egrep d$ test
Hello World
왜 그럴까요? 규칙은 무엇입니까?
답변1
따옴표는 쉘에 의해 확장되며 grep
표시되는 내용을 결정합니다.
의 경우 grep -E '\<H'
작은따옴표 사이의 문자는 문자 그대로 전달되므로 grep은 \<H
단어 시작 부분에 앵커가 포함된 정규식을 확인합니다 \<
.
백슬래시 문자를 사용하면 grep -E \<H
셸에서 특별한 의미가 제거되고 정규식이 표시됩니다. 이와 같은 줄과 일치하는 항목이 표시됩니다.<
grep
<H
<Hello>
를 사용하면 grep -E <H
이 <
문자는 셸에서 리디렉션 문자로 특별한 의미를 가지므로 grep
표준 입력에서 호출된 파일의 내용이 수신됩니다.H
grep 'd$'
or 를 사용하면 grep d\$
달러 기호가 인용되어 다음과 같이 됩니다 grep
. 정규식은 이며 줄 끝의 a 와 d$
일치합니다 .d
grep d$ test
기호 뒤에 유효한 변수 이름이나 유효한 구두점( , ) $
이 없습니다 . 이런 일이 발생하면 쉘은 기호를 문자 그대로 전달하므로 정규식을 다시 볼 수 있습니다 . 확장은 유효한 변수 이름이 뒤에 오는 경우에만 발생합니다(변수가 정의되지 않은 경우에도 중요한 것은 or와 같은 이름 또는 or 와 같은 단일 문자 변수가 뒤에 오는 것입니다 ). 또는 struct , , (또한 bash 및 zsh 및 zsh의 더 많은 구성).${
$(
$
grep
d$
$
$PATH
$fioejsfoeij
$-
$$
${…}
$(…)
$((…))
$[…]
셸 확장에 대한 전체 규칙은 너무 복잡하여 한두 개의 기사에서 설명할 수 없습니다. 실제로는 일반적인 경우를 기억하는 것으로 충분합니다.
\
(백슬래시) 개행 문자가 아닌 한 다음 문자를 인용하고 백슬래시는 항상 제거됩니다.'…'
(작은따옴표)는'
자신을 제외한 모든 문자를 인용합니다."…"
(큰따옴표)는 를 제외한 모든 문자를 인용하고"$\`
,\
큰따옴표 안에 있으면 다음 문자가 문자 그대로 해석되어 다음 문자가 특수한 경우에만 제거됩니다.
답변2
먼저 \<
쉘에 의해 이스케이프되면 해당 값은 리터럴 <
문자가 됩니다. 따라서 전달된 정규 표현식은 특별한 의미가 없는 grep
string 입니다 .<H
이 특정 관계에 대해 더 자세히 알고 싶다면 Giles의 답변을 확인해야 합니다.