각 단어의 시작 부분에 있는 특수 문자와 일치하도록 grep에 지시하는 방법

각 단어의 시작 부분에 있는 특수 문자와 일치하도록 grep에 지시하는 방법

에 대해 몇 가지 질문이 있습니다 grep.

  1. 다음 명령이 ' <Hello'와 일치하는 이유는 무엇입니까?

    $ grep -E "\<H" test
    Hello World
    <Hello
    H<ello
    
  2. ' '만 일치시키려면 어떻게 해야 합니까 <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)입니다.

패턴이 전체 줄과 일치하도록 하려면 -xgrep에 옵션을 추가하세요.

grep -xE '<Hello'

동일한 내용을 가진 행만 일치됩니다 "<Hello".

줄의 시작 부분에서 일치시키려면:

grep -E '^<Hello'

"<Hello"( 및 와 일치 "<Hello world>"하지만 World <Hello.

<Hello앞에 공백이 아닌 문자 와 일치하지 않습니다(내 해석은단어의 시작 부분에):

grep -E '(^|[[:blank:]])<Hello'

또는 BRE를 사용하세요.

grep '^\(.*[[:blank:]]\)\{0,1\}<Hello'

관련 정보