次のような多くのテキスト ファイルで構成される辞書 (python dict ではない) があります。
##Berlin
-capital of Germany
-3.5 million inhabitants
##Earth
-planet
事実を含む辞書のエントリを 1 つ表示するにはどうすればよいですか?
ありがとうございました!
次のような多くのテキスト ファイルで構成される辞書 (python dict ではない) があります。
##Berlin
-capital of Germany
-3.5 million inhabitants
##Earth
-planet
事実を含む辞書のエントリを 1 つ表示するにはどうすればよいですか?
ありがとうございました!
できません。grepには、可変量のコンテキストを表示する方法がありません。-Aを使用して、一致後に3行を表示するなど、一致後に設定された行数を表示-A3
できますが、可変数の行にすることはできません。
「段落モード」でファイルから読み取り、正規表現に一致するブロックを出力する簡単なPerlプログラムを作成できます。
grepがperl正規表現をサポートしている場合は、次のように実行できます。
grep -iPzo '(?s)##Berlin.*?\n(\n|$)'
このパターンの詳細については、この回答を参照してください。
次のようにGNUsedを使用して実行することもできます。
query=berlin
sed -n "/$query/I"'{ :a; $p; N; /\n$/!ba; p; }'
つまり、大文字と小文字を区別しない場合は$query
、空の行が見つかるまで(/\n$/
)、またはファイルの終わり()まで印刷します$p
。
両方の場合の出力(空白のわずかな違い):
##Berlin
-capital of Germany
-3.5 million inhabitants
andy Lester が指摘したように、grep でさまざまな量のコンテキストを表示することはできませんが、短い awk ステートメントで期待どおりの結果が得られる可能性があります。
サンプルファイルの名前が次の場合file.dict
:
awk -v term="earth" 'BEGIN{IGNORECASE=1}{if($0 ~ "##"term){loop=1} if($0 ~ /^$/){loop=0} if(loop == 1){print $0}}' *.dict
戻り値:
##Earth
-planet
変数term
を探しているエントリに変更するだけです。
次の 2 つのことを前提とします。