패턴과 일치하는 텍스트 블록 인쇄

패턴과 일치하는 텍스트 블록 인쇄

쉘 스크립트만 사용하여 어떻게 텍스트 파일을 검색하고 일부 텍스트가 포함된 전체 줄 블록을 모두 나열할 수 있습니까(간단한 grep 기준).

"-----------------"텍스트 파일에는 "\n\n\n--------------------"(정확히 말하면 각 블록은 약 50자 "-"로 시작함)로 구분된 줄 블록이 있습니다.

샘플은 다음과 같습니다.

-------------------------------
Abracadabra, blablablalbalba
blablablabla, banana



-------------------------------
Text, sample text, sample text, sample text
Text, sample text, sample text, sample text
Text, sample text, sample text, sample text
Text, sample text, sample text, sample text


-------------------------------  
Text, sample text, sample text, sample text
banana. Sample text, sample text, sample text, sample text
Text, sample text, sample text, sample text

검색 기준으로 "바나나"라는 단어를 고려해 보겠습니다. 따라서 나열된 블록은 다음과 같습니다.

-------------------------------
Abracadabra, blablablalbalba
blablablabla, banana


-------------------------------
Text, sample text, sample text, sample text
banana. Sample text, sample text, sample text, sample text
Text, sample text, sample text, sample text

편집하다:

예를 들어, awk 'BEGIN{RS="\n------------"}/INFO/{print}'INFO는 검색할 항목입니다. 블록 전체를 얻을 수는 없습니다. 실제 샘플과 결과는 다음과 같습니다.

실제 샘플(처음 3개의 새 줄 포함):


-------------------------------------
별도의 디렉토리: adis, IWZLM(/home/interx/adis/src/IWZLM.SRC)
Gerando rotina em linguagem C:
(yla5 adis IWZLM -if)
.INFO => Rotina BLOQUEADA(상태 "M"): Geracao ignorada(-is para ignorar checagem do status 사용)

[ OK-I ] IWZLM(adis) - 일반 사용자의 목록: Geracao ignorada do codigo em C.



-------------------------------------
디렉토리 내의 별도 디렉토리: adis, ADISA(/home/interx/adis/src/ADISA.SRC)
Gerando rotina em linguagem C:
(yla5 adis ADISA -if)
.ERRO:팔하 이네스페라다

컴파일러:
(ycomp adis ADISA -exe adis/exe/ADISA.temp.exe )
adis/exe/ADISA.temp.exe => adis/exe/ADISA

[ 확인 ] ADISA(adis) - 메뉴 A: Gerada e compilada com sucesso.



-------------------------------------
디렉토리는 adis, ADISD1(/home/interx/adis/src/ADISD1.SRC)입니다.
Gerando rotina em linguagem C:
(yla5 adis ADISD1 -if)
.ATENCAO: 현지화 정의

컴파일러:
(ycomp adis ADISD1 -exe adis/exe/ADISD1.temp.exe )
adis/exe/ADISD1.temp.exe => adis/exe/ADISD1

[ 확인 ] ADISD1(adis) - 메뉴: Gerada e compilada com sucesso.

전체 블록을 얻을 수 없으며 ORS 설정 여부에 관계없이 일반 grep과 같이 "INFO"가 포함된 행만 얻을 수 있습니다.

$ cat file  | awk 'BEGIN{RS="\n------------"}/INFO/{print}' 
.INFO =>Rotina BLOQUEADA (status 'M'): Geracao ignorada (use -is para ignorar checagem do status)

노트: AIX 7.1에서는 gawk가 아니라 awk입니다.

답변1

awk '
{
  if (/-------------------------------------------------/) {
    if (hold ~ /INFO/) {
      print hold;
    }
    hold="";
  } else {
    hold=hold "\n" $0
  }
} 
END {
  if (hold ~ /INFO/) {
    print hold;
  }
}' file

이는 "hold" 변수(ala sed)를 사용하여 구분된 블록 사이에 줄을 누적합니다. 일단 새 블록(또는 EOF)이 발견되면 저장된 값은 /INFO/ 패턴과 일치하는 경우에만 인쇄됩니다.

(이전 댓글에 대한 답변, 이 답변을 정리하기 위해 이전의 부적절한 awk 및 perl 답변을 삭제했습니다)

답변2

awk-출력에 모든 것이 필요하지 않다면 쉬울 것입니다.

awk -vRS='----' '/banana/{print}' file

또는 pcregrep:

pcregrep -M '^-+[^-]*banana[^-]*' file

답변3

앞에 빈 줄이 없어도 괜찮다면 sed해결 방법은 다음과 같습니다.

sed '/---/b end                      # if line matches pattern branch to : end
//!{H                                # if it doesn't match, append to hold space
$!d                                  # and if not on the last line, delete it
$b end                               # if it's the last line branch to : end
}
: end                                # label end
x                                    # exchange hold buffer and pattern space
/PATTERN/!d                          # if pattern space doesn't match, delete it
' <infile

답변4

그 중 하나는 정규식을 전달하려면 백슬래시가 포함될 때 이스케이프해야 한다는 것입니다. 제공된 입력에 대해 테스트됩니다.실제 샘플

구문 분석 코드

#!/usr/bin/nawk -f
BEGIN{ORS=RS="\n\n\n"}   # the record separator is considering three \n
$0~var1{print}           # when record contains var1 print record 

구현하다

## the pattern is passed as var1 and is considering the occurrence of OK as a word
parrsel -v var1=paragraphs -vvar1='\\<OK\\>' data

-------------------------------------------------
Diretório separado do nome o arquivo: adis, IWZLM (/home/interx/adis/src/IWZLM.SRC)
Gerando rotina em linguagem C:
(yla5 adis IWZLM -if)
.INFO =>Rotina BLOQUEADA (status 'M'): Geracao ignorada (use -is para ignorar checagem do status)

[  OK-I ] IWZLM (adis) - Lista lay: Geracao ignorada do codigo em C.



-------------------------------------------------
Diretório separado do nome d arquivo: adis, ADISA (/home/interx/adis/src/ADISA.SRC)
Gerando rotina em linguagem C:
(yla5 adis ADISA -if)
.ERRO: Falha inesperada

Compilando o programa:
(ycomp adis ADISA -exe adis/exe/ADISA.temp.exe )
adis/exe/ADISA.temp.exe => adis/exe/ADISA

[  OK   ] ADISA (adis) - Menu A : Gerada e compilada com sucesso.

관련 정보