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つの段落すべてを意味します。-Aおよび-Bオプションを指定してgrepを使用することもできますが、問題は、コンテンツの段落が任意の数の行で構成されている可能性があることです。そして、これはまさにこの特定の例です。構造が完全に異なる可能性があります。

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

4

1 に答える 1

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

サンプル テキストと 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.

awk の詳細については、次の優れたチュートリアルを (数回) 読んでください: The Grymoire's Awk Tutorial

IHTH

于 2012-12-04T02:46:12.800 に答える