2012-12-03 5 views
5

一部のセクションに同じ構造の複数の段落が含まれているテキストファイルを使用していることがあります。複数行の半構造化コンテンツを簡単に解析してクエリする方法

Some unrelated preface I'm not interested in... Lorem ipsum dolor sit amet, 
consectetur adipiscing elit. Etiam scelerisque. 
Lorem ipsum dolor sit amet, consectetur adipiscing elit. 
Etiam scelerisque. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam scelerisque. 

001 [SomeTitle 1] - Some Subtitle 1 
    Name: SomeName 
    Area: SomeArea 
    Content: Some multi-line comment...Lorem ipsum dolor sit amet, consectetur 
      adipiscing elit. Etiam scelerisque. Lorem ipsum dolor sit amet, 
      consectetur adipiscing elit. Etiam scelerisque. 

002 [SomeTitle 2] - Some Subtitle 2 
    Name: SomeOtherName 
    Area: SomeOtherArea 
    Content: Some other multi-line comment...Lorem ipsum dolor sit amet, consectetur 
      adipiscing elit. 

私はこのようなファイルを照会する簡単な方法を探しています: はここに例を示します。たとえば、「Area:SomeOtherArea」を検索すると、結果はその領域のファイルのすべてのブロックになります。ヘッダー、名前、エリア、内容の4つの段落をすべて意味します。 grepを-Aと-Bオプションと一緒に使うことができましたが、コンテンツ段落が任意の数の行で構成されている可能性があるという問題があります。これはこの具体的な例です。構造は完全に異なっている可能性があります。

私は、軽量で、簡単に適応可能なソリューション、多分CLIツールの組み合わせを探しています。私は車輪を再発明したくありません。

+0

質問に割り当てたタグのそれぞれにマウスを重ねます。いくつかのフォロワーはゼロです。ターゲットOS(Unix/vs/Linux/vs/Windows/vs/Cygwin/...?)とシェルを快適に使えるツールを含むようにタグを変更する方が良いでしょうか? bash/kshを実行し、検索ツールgrepを追加しますか?その他。がんばろう。 – shellter

答えて

2

申し訳ありませんが、これまでのところ、この種の問題に取り組むことができます。機能の無限に拡張可能なセットを備えたスイス軍ナイフを望んでいるようですが、プログラミングのための苦労はありません。 )!そのようなことは中程度に可能ですが、広く公開された仕様では、人々はこの種の問題を解決するためにLucene、Google、その他の検索エンジンを構築するのに何年も費やすことを思い出してください。

これは、非常に単純な規則を守らなければならない検索ツールに満足していて、Unix/Linux/Cygwinシステムを使用している、またはアクセスしている場合、次のことが可能です。

基本ルール:データのブロックは、(上記のあなたのサンプルデータのように)各ブロックを分離するなどの空白に基づいて検索されます。

cat paraSearch.ksh 

#!/bin/ksh 
# (or #!/bin/bash or likely others) 

case $# in 0) echo "usage:paraSearch.ksh SearchTargetPattern file2search [file2 ....]" ; exit 1 ;;esac 

# read the first pattern as the search target, 
# use quotes on cmd-line if you want to use 
# regexp chars like '*' 
mySrchPat="$1" ; shift 

#dbg set -vx 
awk -v mySrchPattern="$mySrchPat" \ 
    'BEGIN{RS=""; ORS="\n\n"} 
    #dbg {print "$0="$0; print "----------------------------------------------" } 
    $0 ~ mySrchPattern{ print $0} 
' "${@}" 

chmod 755 paraSearch.ksh 

awkの詳細については、あなたのサンプルテキストとsearchTargetのAND出力

$ ./paraSearch.ksh SomeName multiLineTest.txt 
001 [SomeTitle 1] - Some Subtitle 1 
    Name: SomeName 
    Area: SomeArea 
    Content: Some multi-line comment...Lorem ipsum dolor sit amet, consectetur 
      adipiscing elit. Etiam scelerisque. Lorem ipsum dolor sit amet, 
      consectetur adipiscing elit. Etiam scelerisque. 

を使用した試験は、この優れたチュートリアル(数回)通読​​: The Grymoire's Awk Tutorialを。

IHTH

関連する問題