パターンに一致するテキストブロックの印刷

パターンに一致するテキストブロックの印刷

シェルスクリプトのみを使用してテキストファイルを検索し、いくつかのテキストを含む完全な行ブロックをすべて一覧表示できます(簡単な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

その1つは、正規表現を渡すためにバックスラッシュが含まれているときにエスケープする必要があることです。提供された入力に対してテストされます。実際のサンプル

解析コード

#!/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.

関連情報