grep
5번의 실행에서 다음 동작을 관찰했습니다.
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
지난 두 번의 시도 에서 결과가 반환되지 않은 이유를 이해할 수 없습니다 .
답변1
grep
패턴은 정규 표현식(regex, regexp, RE라고도 함)입니다.기초적인-E
// -F
// / 옵션 중 하나가 사용 되지 않는 한 정규식(BRE)입니다 -P
(처음 두 개만 표준 옵션임).-K
-X
*
이전 항목 중 0개 이상과 일치하는 정규식 연산자입니다.원자. 예를 들어 d*
0개 이상의 d
을 일치시킵니다. BRE에서는 패턴의 시작 부분에 있거나 또는 정규 표현식 연산자 뒤에 있을 때만 리터럴과 일치합니다 ^
( \(
대괄호 표현식 *
내에서도 문자 그대로 사용됩니다 ).[...]
따라서 grep '*README.md*'
텍스트, 단일 문자( 정규식 연산자), 그 뒤에 *
임의 개수의 s가 오는 행이 일치됩니다. ~부터README
.
m
d
임의의 숫자기능적으로 동일한 0을 포함합니다 grep '*README.m'
(이것은 일치하는 줄에 영향을 주지 않고 줄 내에서 일치할 수 있는 것만 영향을 미칩니다(예: --color
GNU 옵션으로 표시됨 grep
).
예를 들어 다음 두 줄과 일치합니다.
*README mike
^^^^^^^^^
DONT***README-mddd
^^^^^^^^^^^^
( ^
s는 줄의 내용이 정규식과 일치함을 보여줍니다. 이를 사용하여 확인할 수 있습니다 --color
.)
여기서는 정규식과 쉘 와일드카드 패턴을 혼동하고 있는 것 같습니다. *
0개 이상의 문자와 일치하는 정규식에 와일드카드 연산자를 작성할 수 있습니다 . .*
그러나 다음을 수행하십시오.
grep '.*README\.md.*'
다시 다음과 같을 것입니다:
grep 'README\.md'
grep
짝을 찾을 때이내에패턴과 정확히 일치하는 행(필요한 -x
)을 찾는 대신 행을 사용합니다.
역시 내장 grep
된 ast-open을 사용하면 (기본적으로 항상 내장되어 있는 것은 아니며 앞에 넣어 활성화 해야 함 ) 쉘 와일드카드(확장 ksh93 와일드카드)를 사용 하는 옵션을 사용할 수 있습니다 . 따라서 이 구현을 통해 다음을 수행할 수 있습니다.ksh93
grep
/opt/ast/bin
$PATH
-K
grep
grep
grep -K 'README.md'
또는
grep -xK '*README.md*'
일치 항목에 가 포함되어 있습니다 README.md
.
동일한 구현을 사용하면 -E
확장()에서도 와일드카드 일치를 활성화할 수 있습니다.향상된( -X
) 또는 펄과 유사한 ( -P
) 연산자가 포함된 정규식 (?K)
( \(?K\)
실제로 기본 정규식에서 POSIX 적합성을 깨뜨리므로 향후 버전에서 제거될 수 있으므로 이에 의존하지 않을 것입니다). 그래서 당신은 이것을 할 수 있습니다 :
grep -xE '(?K)*README.md*'
거기.
최신 grep
구현을 사용하면 다음도 수행할 수 있습니다.
grep -F README.md
고정 문자열 검색에 사용됩니다( .
위는 .
문자가 아닌 리터럴과 일치합니다).