실행할 때 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
div 앞에 /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
고정 문자열 검색 (여기서 .
위의 .
은 리터럴 .
문자 대신).
+
,grep -P
grep -E
도 마찬가지입니다. 그*
는 시작 부분이 BRE에 대해서만 지정 될 때 문자 그대로 처리됩니다. 다른 RE, YMMV를 사용합니다.grep
(또는grep -G
)도 사용하고 있습니다.grep -K
(여기서*
는 모든 문자와 일치).*
를 의미하는 경우 POSIX 사양