에 대해 몇 가지 질문이 있습니다 grep
.
다음 명령이 '
<Hello
'와 일치하는 이유는 무엇입니까?$ grep -E "\<H" test Hello World <Hello H<ello
' '만 일치시키려면 어떻게 해야 합니까
<Hello
?
답변1
grep
문자열(정규 표현식)의 특별한 해석을 방지하려면 -F
(또는 --fixed-string
)을 사용하십시오.
$ cat test
one < two
Hello World
X<H
A <H A
I said: <Hello>
$ grep -F '<H' test
X<H
A <H A
I said: <Hello>
검색 패턴을 올바르게 인용해야 한다는 점을 기억하십시오. 그렇지 않으면 쉘이 이를 잘못 해석할 수 있습니다. 예를 들어, grep -F <H test
대신 실행하면 셸은 "H"라는 파일을 열고 이를 사용하여 문자열 "test"를 검색합니다 grep
. grep
다음 명령은 서로 거의 동일하지만 위의 명령과는 다릅니다.
grep -F <H test
grep -F test <H # location of `<H` does not matter
grep -F H test
cat H | grep -F test # useless cat award
단어만 일치하는 경우 맨 페이지를 확인하세요 grep(1)
.
-w, --word-regexp
Select only those lines containing matches that form whole words. The
test is that the matching substring must either be at the beginning of
the line, or preceded by a non-word constituent character. Similarly,
it must be either at the end of the line or followed by a non-word
constituent character. Word-constituent characters are letters,
digits, and the underscore.
사용 예(위의 테스트 파일 사용):
$ grep -F -w '<H' test
A <H A
( -F
여기서는 <H
특별한 의미가 없으므로 선택 사항이지만 이 리터럴 모드를 확장하려는 경우 유용할 수 있습니다.)
단어의 시작 부분을 일치시키려면 정규 표현식이 필요합니다.
$ grep -w '<H.*' test # match words starting with `<H` followed by anything
A <H A
I said: <Hello>
답변2
<
grep에는 특수 문자가 없습니다. 그러나 GNU에서 grep은 \<
특별합니다.단어의 시작Hello
(따라서 모든 입력 라인 앞에는 너비가 0인 테두리가 있습니다).
모든 grep
것 중에서 \
특별합니다 . 특수 문자를 이스케이프 처리하여 특수 의미를 제거하거나(문자 그대로 일치하도록) 문자에 특수 의미를 추가할 수 있습니다(종종 기존 스크립트를 깨지 않고 새 연산자를 소개하는 데 사용됩니다. 대안은 또는 와 같은 유효하지 않은 콘텐츠를 사용하는 것입니다 *?
) (?
또는 ANSI C \n
, \t
... 와 같은 이스케이프 시퀀스
제거할 특별한 의미는 \
다른 의미와 마찬가지로 또 다른 의미가 필요합니다 \
.
따라서 일치하려면 <Hello
다음이 필요합니다.
grep -E '<Hello'
일치하려면 \<Hello
다음이 필요합니다.
grep -E '\\<Hello'
<
및 \
둘 다 특별하다는 점에 유의하세요.껍질을 벗기다인용도 필요하다쉘용마찬가지로 위의 작은따옴표( \
큰따옴표 안의 다른 특수 문자(예: 개행, 큰따옴표, 백슬래시, 달러 또는 백틱) 앞에만 있지만 큰따옴표 안의 셸에도 특별하므로 필수 grep -E "\\\<Hello"
또는 grep -E "\\\\<Hello"
일치 \<Hello
)입니다.
패턴이 전체 줄과 일치하도록 하려면 -x
grep에 옵션을 추가하세요.
grep -xE '<Hello'
동일한 내용을 가진 행만 일치됩니다 "<Hello"
.
줄의 시작 부분에서 일치시키려면:
grep -E '^<Hello'
"<Hello"
( 및 와 일치 "<Hello world>"
하지만 World <Hello
.
<Hello
앞에 공백이 아닌 문자 와 일치하지 않습니다(내 해석은단어의 시작 부분에):
grep -E '(^|[[:blank:]])<Hello'
또는 BRE를 사용하세요.
grep '^\(.*[[:blank:]]\)\{0,1\}<Hello'