
아래 내용이 포함된 파일이 있습니다.
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 xample
xample
-e
xample
세 번째 경우에는 \-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에서 예기치 않은 문자와 일치하는 대괄호 표현식(범위 없음)해당 접근 방식으로 발생할 수 있는 합병증에 대해 설명합니다.