GNU grep 정규 표현식에서 따옴표 사용

GNU grep 정규 표현식에서 따옴표 사용

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의 더 많은 구성).${$($grepd$$$PATH$fioejsfoeij$-$$${…}$(…)$((…))$[…]

셸 확장에 대한 전체 규칙은 너무 복잡하여 한두 개의 기사에서 설명할 수 없습니다. 실제로는 일반적인 경우를 기억하는 것으로 충분합니다.

  • \(백슬래시) 개행 문자가 아닌 한 다음 문자를 인용하고 백슬래시는 항상 제거됩니다.
  • '…'(작은따옴표)는 '자신을 제외한 모든 문자를 인용합니다.
  • "…"(큰따옴표)는 를 제외한 모든 문자를 인용하고 "$\`, \큰따옴표 안에 있으면 다음 문자가 문자 그대로 해석되어 다음 문자가 특수한 경우에만 제거됩니다.

답변2

먼저 \<쉘에 의해 이스케이프되면 해당 값은 리터럴 <문자가 됩니다. 따라서 전달된 정규 표현식은 특별한 의미가 없는 grepstring 입니다 .<H

이 특정 관계에 대해 더 자세히 알고 싶다면 Giles의 답변을 확인해야 합니다.

관련 정보