grep

grep

다음을 수행해야 합니다.

"hi"와 "hello" 패턴 사이에 텍스트를 인쇄합니다.

패턴이 반복될 수도 있고 여러 번 나타날 수도 있습니다 hi.hello

소스 파일:

hi aa bb cc
dd ee ff
hello xxxxxx
aaaa dddd cccc hi aaa bbb
ccc hello cccc fff

예상 출력.

hi aa bb cc
dd ee ff
hello
hi aaa bbb
ccc hello

awkand 명령을 사용해 보았지만 sed -n첫 번째 항목과 마지막 항목 사이의 모든 줄이 표시됩니다.hihello

답변1

~에서첫 번째안녕하세요첫 번째안녕하세요 다음입니다.

grep

(GNU) grep 및 tr 사용:

$ <infile grep -oPz "(?s)hi.*?hello" | tr '\0' '\n'
hi aa bb cc
dd ee ff
hello
hi aaa bbb
ccc hello

설명하다:

  • <infile소스 파일.
  • grep -oPz 부르다 grep:
    • ( -P)는 다음과 일치합니다.상업용 부동산(Perl 호환 정규식)
    • ( -o)일치하는 부분만 인쇄됩니다.
    • ( -z)를 사용하다ero 바이트(일명 NUL 및 일명 \0)를 줄 구분 기호로 사용합니다.
  • "(?s)PCRE 점( .)도 개행 문자와 일치하도록 만듭니다.
  • hi문자열로 시작하십시오 hi.
  • .*?다음 문자와 모두 일치합니다( 이기 때문에 탐욕스럽지 않음 ?).
  • hello"문자열이 hello일치할 때까지.
  • | tr '\0' '\n'NUL( \0) 바이트를 grep -z개행 문자로 변환합니다.

sed

GNU sed:

<infile sed 's/hi/\n&/;s/[^\n]*\n//;s/\(hello\).*/\1/;/hi/,/hello/!d'

\n또는 오른쪽을 허용하지 않는 BSD sed의 경우 변수를 s///정의해야 합니다 .newlinenl

$ eval "$(printf "nl='\n'")"

그런 다음:

<infile sed 's/hi/\'"$nl"'&/;s/[^\n]*\n//;s/\(hello\).*/\1/;/hi/,/hello/!d'

또는 명시적인 개행 문자를 작성할 수 있는 경우:

<infile sed 's/hi/\
&/;s/[^\n]*\n//;s/\(hello\).*/\1/;/hi/,/hello/!d'

답변2

grep -oPz "(?s)hi.*?hello" fileName

설명은 다음과 같습니다.

고양이 TMP

출력->

hi aa bb cc
dd ee ff
hello xxxxxx
aaaa dddd cccc hi aaa bbb
ccc hello cccc fff
00000000000
hi ff 
djd h
sdkf hello
dfj 

해결책:

grep -oPz "(?s)hi.*?hello" tmp

출력->

hi aa bb cc
dd ee ff
hello
hi aaa bbb
ccc hello
hi ff 
djd h
sdkf hello

매개변수:

  • -z이 옵션은 grep에게 개행 문자를 일반 텍스트 문자로 처리하고 레코드를 구분하기 위해 널 바이트를 찾도록 지시합니다. 널 바이트가 없는 텍스트 파일에서는 grep -z전체 파일이 한 줄로 처리됩니다.

  • (?s)'.'을 의미하는 PCRE_DOTALL을 활성화하면 문자나 개행 문자를 찾습니다.

  • o일치하는 부분만 인쇄

  • -P 패턴을 Perl 호환 정규식(PCRE)으로 해석합니다. 이는 특히 -z(--null-data) 옵션과 결합할 때 매우 실험적이며 "grep -P"는 구현되지 않은 기능에 대해 경고할 수 있습니다.

  • .*?욕심없는 매칭을 위해. hi첫 번째 인스턴스를 찾으면 다음 일치 항목 검색을 시작하세요.hello

    원천:https://www.gnu.org/software/grep/manual/grep.html

답변3

앗 낄낄거려

#!/usr/bin/awk -f
{
    n=split($0, col, FS)
    for(i=1;i<=n;i++){
        (i==n)? sp="" : sp=FS
        if (col[i] ~ /hi/) p=1
        if (p == 1  && col[i] ~ /hello/) h=1
        if (p == 1) printf("%s%s",col[i],sp)
        if (h==1) p=0;h=0
    }
    printf "\n"
}



kapu@jake:$ cat SourceFile
hi aa bb cc
dd ee ff
hello xxxxxx
aaaa dddd cccc hi aaa bbb
ccc hello cccc fff
kapu@jake:$ script.awk SourceFile
hi aa bb cc
dd ee ff
hello
hi aaa bbb
ccc hello

관련 정보