何百ものセクションを含む繰り返しパターンを持つ数千のファイルを含むディレクトリがあります。
###############
# 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に指示します。