grep包含单词到文档的完整句子

时间:2014-07-11 10:08:33

标签: bash shell grep sentence

我想提取一个完整的句子“。”把“。”写成一个单词的文件。 例如,给出了这个文本:

  

Dijkstra的原始算法不使用最小优先级队列。为一个   给定图中的源顶点(节点),算法找到路径   在该顶点和顶点之间具有最低成本(即最短路径)   每隔一个顶点。它也可以用于寻找最短的成本   通过停止从单个顶点到单个目标顶点的路径   算法一旦到达目标顶点的最短路径就具有   已经确定。

我想要包含“graph”的整个句子

  

对于图中给定的源顶点(节点),算法会找到   该顶点之间成本最低(即最短路径)的路径   和其他每个顶点。

如果它包含图形,那么找到一种在结果中包含起始句子的方法会很有用,因为它之前没有点。

4 个答案:

答案 0 :(得分:3)

假设文本文件dijk实际上并不包含任何换行符,您可以在perl中执行此操作:

perl -MLingua::EN::Sentence=get_sentences -ne '
print "$_\n" for grep { /graph/ } @{get_sentences($_)}' dijk

Lingua::EN::Sentence module非常聪明,可以处理众所周知的缩写,如果需要,您可以添加自己的缩写。

输出:

For a given source vertex (node) in the graph, the algorithm finds the path with lowest cost (i.e. the shortest path) between that vertex and every other vertex.

如果输入中确实存在换行符,则应该可以毫不费力地调整脚本。


修改

如果输入中有换行符,您可以改为:

perl -MLingua::EN::Sentence=get_sentences -00 -e '
$t = <>;         # slurp the whole file
$t =~ tr{\n}{ }; # convert newlines to spaces
print "$_\n" for grep { /graph/ } @{get_sentences($t)}' dijk

当然,到目前为止,这看起来更像是一个完整的perl脚本而不是单行内容!

或者,如@ mklement0所述,您可以使用外部工具tr执行翻译并将结果传递给原始脚本:

perl -MLingua::EN::Sentence=get_sentences -ne '
print "$_\n" for grep { /graph/ } @{get_sentences($_)}' <(tr '\n' ' ' < dijk)

答案 1 :(得分:1)

原始启发式:

cat text |
    tr '\n' ' ' |
    sed 's|[[:alpha:]]\{3\}\.[[:blank:]]*|&\'$'\n''|g' |
    grep -Fi 'graph'
  • 首先,tr删除输入文件中的所有行尾(不知道您是否需要这样做)
  • 然后,sed将每个句子放在自己的行上,假设一个前面有三个字母的点表示句子的结尾。根据您的输入文件,您可能需要调整此部分以降低&#34;误报&#34;率
  • 最后,一个简单的grep将只保留包含所需单词的句子(不区分大小写)。

根据您的输入文件,这将产生以下结果:

  

对于图中给定的源顶点(节点),算法找到该顶点与每个其他顶点之间成本最低(即最短路径)的路径。


这个答案已经与 mklement0 的帮助符合POSIX标准
(见下面的评论)

答案 2 :(得分:0)

grep -o "\.([^.\r\n]+\.)" inputfile > outputfile

如果原始文件中没有换行符,那么它会更简单:

grep -o "\.([^.]+\.)" inputfile > outputfile

答案 3 :(得分:0)

这是一种方法。

tr '\n' ' ' < input.txt | tr '.' '\n' | grep graph > output.txt

它将所有换行转换为空格(以便整个文本在一行中)。然后它将所有.转换为换行符,以便每行一个句子。然后greps查找相关字符串并将匹配的句子放入输出文件中。

在您的段落上运行时,它会有效,但.中的i.e.会混淆它。这可以通过将一些固定字符串(例如i.e.e.g.)更改为ieeg来进行纠正。