작은따옴표를 사용할 때 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는 입니다 -example. 이는 옵션 에 대한 인수 이므로 grep검색 하십시오 .-e xamplexample-example

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

-example선택 사항으로 간주되지 않으 려면 다음 중 하나가 필요합니다.

  • grep -- -example file. --옵션의 끝을 표시합니다 . 그 이후의 모든 것은 옵션이 아닙니다(따라서 첫 번째 인수는 검색할 패턴이고 나머지는 살펴볼 파일 목록입니다).
  • grep -e -example file. 여기서는 옵션 -example에 대한 인수로 간주됩니다 -e.

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

grep -e "$pattern" file

또는

grep -- "$pattern" file

보장할 수 없다면 $pattern로 시작하지 않을 것입니다 -.

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

grep '[-]example' file

보아도Bash에서 예기치 않은 문자와 일치하는 대괄호 표현식(범위 없음)해당 접근 방식으로 발생할 수 있는 합병증에 대해 설명합니다.

관련 정보