パターンの前後に異なる行数を印刷します。

パターンの前後に異なる行数を印刷します。

何百ものセクションを含む繰り返しパターンを持つ数千のファイルを含むディレクトリがあります。

###############
# Section 1
###############
some text
more text
some more text
some text
more text
some more text    
###############
# Section 2
###############
some text
more text
some more text
interesting-pattern
some text
more text
some more text    
###############
# Section 3
###############
some text
more text
some more text
some text
more text
some more text

私がすべきことは、「興味深いパターン」が存在するセクション全体を抽出する方法を見つけることです。

-Aおよび-Bフラグを使用してgrep -iEr 'interesting-pattern'を試しましたが、各ファイルで興味深いパターンの前後の行数が異なる可能性があるため、機能しませんでした。

これを行う最良の方法は何ですか?

答え1

これはgrepの仕事ではなく、awkのようなより良いツールの仕事です。

簡単な回避策は、gnu awkとカスタムレコード区切り記号RS(例:Section

行を区切るには、「Section」という単語を使用してください。単語間のすべての内容はawkによって行として扱われますSection 1。 2節~3節などは同じです。 Section 2

これで正しい「line」= containを印刷するだけですinteresting-pattern

$ awk -v RS="# Section " '/interesting-pattern/{print RT $0}' file1
# Section 2
###############
some text
more text
some more text
interesting-pattern
some text
more text
some more text    
###############

gnu awk は RS (Record Separator) で正規表現を受け入れるため、次のように RS でより複雑なコンテンツを適用することもできます。

$ awk -v RS="###############\n# Section " '/interesting-pattern/{print RT $0}'
###############
# Section 2
###############
some text
more text
some more text
interesting-pattern
some text
more text
some more text    

PS:{print RT現在使用されているレコード区切り文字を印刷するようにawkに指示します。

関連情報