grepはfile2から正確なラインブロック(file1の内容)を抽出します。

grepはfile2から正確なラインブロック(file1の内容)を抽出します。

file12つのファイルがありますfile2

サンプルの内容は次のとおりですfile1

A B
C D
E F
G H

内容はfile2こんな感じです。

A B
few other lines
E F
few more other lines
A B
C D
E F
G H
few more other lines
G H

file1だから私は全体のコンテンツブロックを検索したいと思いますfile2。これは、出力に次の行のみを含める必要があることを意味します。

A B
C D
E F
G H

注: - 一緒にグループ化された行のみが出力の一部である必要があります。

ベストアンサー1

grep複数行パターンの場合、これは非常に愚かですが、\nパターンとテキストのすべての改行をNUL文字に変換して比較して検索すると、\0問題は解決します。明らかに、\0出力も再翻訳する必要があります。\n

file1検索したいパターンが含まれていると仮定すると、コマンドは次のようになりますfile2

grep -aof <(tr '\n' '\0' < file1) <(tr '\n' '\0' < file2) | tr '\0' '\n'

特定ファイルの出力例:

A B
C D
E F
G H

説明する:

  • <(tr '\n' '\0' < file1)file1と同じですが、すべての改行文字がNUL文字に変換されたFIFO /名前付きパイプ/一時ファイルクラスオブジェクトを作成します。
  • <(tr '\n' '\0' < file2)同じことをしますfile2
  • grep -f PATTERN_FILE INPUT_FILEPATTERN_FILEそれからパターンを検索してくださいINPUT_FILE
  • フラグはバイナリファイルの一致を-a有効にします。grepそれ以外の場合は印刷できない文字(例:\0
  • -oフラグは、grep見つかった行全体ではなく一致するシーケンスのみを印刷します。
  • | tr '\0' '\n'左コマンド出力のすべてのNUL文字を改行文字に変換します。

おすすめ記事