次の構造のファイルがあります。
[Term]
id: GO:0000001
name: mitochondrion inheritance
namespace: biological_process
def: "The distribution of mitochondria, including the mitochondrial genome, into daughter cells after mitosis or meiosis, mediated by interactions between mitochondria and the cytoskeleton." [GOC:mcc, PMID:10873824, PMID:11389764]
synonym: "mitochondrial inheritance" EXACT []
is_a: GO:0048308 ! organelle inheritance
is_a: GO:0048311 ! mitochondrion distribution
この構造は辞書のように何度も繰り返される。各定義は空の改行で始まり、[Term]
後続の定義と区別されます。すべての定義がで始まる行で終わるわけではありませんis_a
。いくつかの用語をgrepして全体の定義を検索したいので、[Term]
null改行、つまり以前に示された構造例が結果になる可能性がありますgrep -i "mitochondria" myfile
。どうすればいいですか?定義ごとの行数は固定されておらず、定義のどの時点でも一致できます。
これが適切なツールかどうかはわかりませんgrep
。問題は、いくつかの単語を一度に一致させたかったので、使い始めたということですgrep -i -e "match" -e "someothermatch"
。regex
私はWindows環境でCygwinを使用しており、明らかにPCREをサポートしています。
ベストアンサー1
あなたの説明によると(強調):
[*Term*]
すべての定義は and で始まります。
空白の改行で、以下と区別されます。
null RS( ) を使用して awk を呼び出すと、RS=''
ファイルは空行に分割されます。
文字列に基づいて選択することもできます。
$ var="someothermatch"
$ awk -v RS='' -v var="$var" '$0~var{print}' infile
得るために努力しなければならない全体の段落そのゲーム。
awkマニュアルから:
RS が空文字列に設定されている場合、レコードは空行で区切られます。 RSが空の文字列に設定されている場合、改行文字はFSが持つことができる値に加えて常にフィールド区切り文字として機能します。