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”,结果应该是具有该区域的文件的所有块。我的意思是所有四个段落:标题、名称、区域、内容。我可以将grep与 -A 和 -B 选项一起使用,但问题是内容段落可能包含任意数量的行。这只是这个具体的例子;结构可能完全不同。

我正在寻找一种轻量级、易于适应的解决方案,也许是 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 和输出进行测试

$ ./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 的 Awk 教程

IHTH

于 2012-12-04T02:46:12.800 回答