실행할 때 grep의 다음 동작을 관찰합니다. 다섯 번 :

me@asus:~/go/src/company/topology-front$ lsof |grep "READ" vim 4788 me 4u REG 8,2 12288 32247694 /home/me/go/src/company/topology-front/.README.md.swp me@asus:~/go/src/company/topology-front$ lsof |grep "README.md*" vim 4788 me 4u REG 8,2 12288 32247694 /home/me/go/src/company/topology-front/.README.md.swp me@asus:~/go/src/company/topology-front$ lsof |grep "README.md" vim 4788 me 4u REG 8,2 12288 32247694 /home/me/go/src/company/topology-front/.README.md.swp me@asus:~/go/src/company/topology-front$ lsof |grep "*README.md*" me@asus:~/go/src/company/topology-front$ lsof |grep "*README.md" me@asus:~/go/src/company/topology-front$ 

grep의 마지막 두 번 시도가 결과를 반환하지 않는 이유를 이해할 수 없습니다. .

Answer

grep 패턴은 정규식입니다 (일명 regex, regexp, RE), -E / -F / iv id = “중 하나가 아닌 경우 기본 정규식 (BRE) 895a869911 “>

/ -K / -X 옵션 (첫 번째 두 개만 표준)이 사용됩니다.

*는 앞의 원자 중 0 개 이상과 일치하는 정규 표현식 연산자입니다 (예 : d*는 0 개 이상의 d와 일치합니다. BRE에서 패턴의 시작 부분에 있거나

또는 \( regexp 연산자, 리터럴 * 와만 일치합니다 (또한 문자 그대로 [...] 대괄호 표현식 안에 있음).

따라서 grep "*README.md*"는 , README, 단일 문자 (. 정규식 연산자), m 뒤에 d가 있습니다. 모든 숫자 에 0이 포함되므로 이는 기능적으로 grep "*README.m"와 동일합니다 (일치하는 행에는 차이가 없으며 일치 할 수있는 항목에서만 (예를 들어 GNU grep--color 옵션으로 표시됨))

예를 들어 , 다음 두 줄에서 일치합니다.

*README mike ^^^^^^^^^ DONT***README-mddd ^^^^^^^^^^^^ 

(줄 내에서 일치하는 내용을 보여주는 ^ --color에서 볼 수있는 정규식으로 볼 수 있습니다.

여기서 정규식과 쉘 와일드 카드 패턴을 혼동하는 것 같습니다. 0 개 이상의 문자와 일치하는 * 와일드 카드 연산자는 정규 표현식에서 .* 작성 될 수 있습니다. 하지만 수행 :

grep ".*README\.md.*" 

다시 동일합니다.

grep "README\.md" 

As grep는 패턴과 정확히 일치하는 줄을 찾는 대신 줄 에서 일치하는 항목을 찾습니다 (이 경우 -x).

ast-open grep (ksh93 “의 내장 (기본적으로 항상 내장되어 있지는 않으며, $PATH/opt/ast/bin을 넣어 활성화해야합니다. >), grep-K 옵션을 사용하여 쉘 와일드 카드 (확장 된 ksh93)를 사용할 수 있습니다. 따라서 grep 구현시 수행 할 수있는 작업 :

grep -K "README.md" 

또는

grep -xK "*README.md*" 

README.md를 포함하는 줄에서 일치합니다.

동일한 구현으로 확장 (), 증강 (-X) 또는 펄 유사 (-P) 일반 (?K) 연산자 (그리고 실제로 POSIX 준수를 위반하는 기본 정규식의 \(?K\))가있는 표현식이므로 그대로 의존하지 않습니다. 향후 버전에서 제거 될 수 있음). 따라서 다음과 같이 할 수 있습니다.

grep -xE "(?K)*README.md*" 

거기

최신 grep 구현에서는 다음을 수행 할 수도 있습니다.

grep -F README.md 

고정 문자열 검색 (여기서 . 위의 .은 리터럴 . 문자 대신).

댓글

  • FWIW : Perl이 또는 +, grep -P
  • @ilkkachu , 여러 구현에서 grep -E도 마찬가지입니다. 그 *는 시작 부분이 BRE에 대해서만 지정 될 때 문자 그대로 처리됩니다. 다른 RE, YMMV를 사용합니다.
  • @St é phaneChazelas ' 선행 별표에 대한 사양을 찾지 못했습니다. . 어디에나 문서화되어 있습니까? 저는 ' 일반 grep (또는 grep -G)도 사용하고 있습니다.
  • @iBug, 답변을 더 신중하게 확인하면 ' 당신이 무엇을 (제 생각에) 알아 차릴 것입니다. ' 참조하는 것은 쉘 패턴을 사용하는 ast-open '의 grep -K (여기서 *는 모든 문자와 일치).
  • @iBug, BRE의 첫 번째 문자가 특별하지 않은 *를 의미하는 경우 POSIX 사양

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다