解析和查询多行半结构化内容的简单方法

Sti*_*mmy 5 command-line parsing multiline structured-data

我偶尔会使用文本文件,其中某些部分确实有多个具有相同结构的段落.这是一个例子:

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.
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种简单的方法来查询这样的文件.例如,如果我查询"Area:SomeOtherArea",结果应该是该区域的文件的所有块.我指的是所有四个段落:标题,名称,区域,内容.我可以使用带有-A和-B选项的grep,但问题是内容段落可能包含任意数量的行.这就是这个具体的例子; 结构可能完全不同.

我正在寻找一种轻量级,易于适应的解决方案,也许是CLI工具的组合.我不想重新发明轮子.

she*_*ter 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
Run Code Online (Sandbox Code Playgroud)

使用示例文本和 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.
Run Code Online (Sandbox Code Playgroud)

要了解有关 awk 的更多信息,请通读(多次)这个优秀教程: Grymoire's Awk 教程

IHTH