작은따옴표를 사용할 때 grep이 예상한 결과를 반환하지 않는 이유는 무엇입니까?

작은따옴표를 사용할 때 grep이 예상한 결과를 반환하지 않는 이유는 무엇입니까?

다음 내용이 포함된 파일이 있습니다.

sh-4.2$ cat file1
example of multiple
pattern
this is an
example of multipole
sorry multiple
pattern matching
using grep
so the example is the
file itself
-example
-multiple
-bye
tata
!

위 파일에서 "-example"을 검색할 때 grep 명령이 원하는 출력을 제공하지 않습니다. 패턴에 "-"가 포함되어 있으면 -e 옵션을 사용해야 한다는 것을 알고 있습니다.

내가 사용한 첫 번째 예에서는-예따옴표 없이 직접:

sh-4.2$ grep -example file1
example of multiple
example of multipole
so the example is the
-example

-예작은따옴표 사용:

sh-4.2$ grep '-example' file1
example of multiple
example of multipole
so the example is the
-example

-예큰따옴표 및 이스케이프 문자 포함

sh-4.2$ grep "\-example" file1
-example
sh-4.2$

답변1

검색 패턴에 "-"가 포함되어 있고 검색 패턴에 "-"가 포함되어 있으면 해당 -e플래그를 사용해야 한다는 것을 알고 있습니다. 해당 플래그를 사용하지 않기 때문에 -e쉘은 "패턴"을 인수(및 매개변수)로 해석합니다. 다음을 통해 볼 수 있습니다:

$ grep "-foo" file1
grep: oo: No such file or directory

확장하면 코드는 인수와 "xample" 인수를 사용하여 실행 grep "-example" file1하려는 셸을 알려줍니다 .grep-e

이는 유사한 접근 방식을 시도할 때 겪었던 것과 동일한 문제입니다. rm -my-silly-file-name작동하지 않았으므로 유사한 접근 방식을 사용해야 합니다 rm ./-my-silly-file-name. 또 다른 해결책은 rm -- -my-silly-file-name다음과 같습니다.

$ grep -- "-example" < file1
-example

"--"는 쉘에 뒤따르는 모든 것을 알려줍니다.아니요논쟁.

또는 다음과 같이 "\"를 사용하여 "-"를 이스케이프 처리할 수도 있습니다.

grep "\-example" file1

이 기사에서는 참조의 세부 사항 중 일부를 자세히 설명합니다.: 관련 부분은셸에서 해석해야 하는 매개변수와 역따옴표 명령은 큰따옴표로 묶입니다.큰따옴표를 사용하면 내용이 셸에서 해석됩니다.

답변2

"'-'로 시작하는 패턴은 -e 옵션을 사용해야 한다는 것을 알고 있지만" 사용해야 할 때 사용하지 않고 있습니다. grep -e -example file1예상한 결과를 얻을 것입니다.

각 예에서 실제로 수행되는 작업은 다음과 같습니다.

  • grep -example file1=> grep -e xample file1(-e가 필요합니다)
  • grep '-example' file1=> grep -e xample file1(-e가 필요합니다)
  • grep "\-example" file1=> grep \-example file1(-e는 필수가 아닙니다)

답변3

로 시작하는 인수는 -옵션으로 간주됩니다.

처음 두 경우에서 전달된 첫 번째 인수 는 해석되는 인수 grep입니다 (options , 따라서 search ).-examplegrep-e xamplexample-example

세 번째 경우에는 로 시작하지 않으므로 \-example로 전달됩니다 . 정규식으로 처리됩니다. 그러나 동작은 POSIX 아래에 지정되어 있지 않으므로 일치하는 내용을 보장할 수 없습니다. 대부분의 구현 에서 a 는 일치 하지만 특수 연산자일 수 있는 구현을 상상할 수 있습니다 (예를 들어 a 는 특수 연산자이고 리터럴과 일치하지 않는 GNU 참조 ) .grep-\-grep\--grep\-grep\++

-example옵션으로 간주되지 않으려면 다음을 수행해야 합니다 .

  • grep -- -example file. --옵션의 끝을 표시합니다 . 그 이후의 모든 것은 옵션이 아닙니다(따라서 첫 번째 인수는 검색할 패턴이고 나머지는 찾을 파일 목록입니다).
  • grep -e -example file. 여기서 매개변수는 옵션 -example으로 처리됩니다 -e.

글쓰기에 익숙해져야 하는 이유는 다음과 같습니다.

grep -e "$pattern" file

또는

grep -- "$pattern" file

보장할 수 없으면 $pattern시작되지 않습니다 -.

여기에 다음과 같이 작성할 수도 있습니다.

grep '[-]example' file

봤지만범위 없는 대괄호 표현식은 bash의 예기치 않은 문자와 일치합니다.이 접근법의 가능한 합병증에 대해.

관련 정보