0

次のような多くのテキスト ファイルで構成される辞書 (python dict ではない) があります。

##Berlin                
-capital of Germany         
-3.5 million inhabitants

##Earth           
-planet

事実を含む辞書のエントリを 1 つ表示するにはどうすればよいですか?

ありがとうございました!

4

3 に答える 3

1

できません。grepには、可変量のコンテキストを表示する方法がありません。-Aを使用して、一致後に3行を表示するなど、一致後に設定された行数を表示-A3できますが、可変数の行にすることはできません。

「段落モード」でファイルから読み取り、正規表現に一致するブロックを出力する簡単なPerlプログラムを作成できます。

于 2012-12-06T15:29:56.590 に答える
0

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
于 2012-12-06T22:17:51.993 に答える
0

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 つのことを前提とします。

  1. 辞書ファイルの拡張子は同じです (例として .dict )
  2. 辞書ファイルはすべて同じディレクトリにあります(コマンドが呼び出される場所)
于 2012-12-06T16:00:46.870 に答える