我偶尔会使用文本文件,其中某些部分的多个段落具有相同的结构。 这是一个例子:
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工具的组合。我不想重新发明轮子。
答案 0 :(得分: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's Awk Tutorial
IHTH