grep:如何在匹配的行之后显示下一行直到空行[不可能!]

时间:2012-12-06 14:49:57

标签: dictionary full-text-search grep

我有一个字典(不是python dict),包含许多这样的文本文件:

##Berlin                
-capital of Germany         
-3.5 million inhabitants

##Earth           
-planet

如何用事实显示字典的一个条目?

谢谢!

3 个答案:

答案 0 :(得分:1)

你做不到。 grep无法显示可变数量的上下文。您可以使用-A在匹配后显示一定数量的行,例如-A3以在匹配后显示三行,但它不能是可变数量的行。

您可以编写一个快速Perl程序,以“段落模式”从文件中读取,然后打印与正则表达式匹配的块。

答案 1 :(得分:0)

正如andy lester指出的那样,你不能让grep在grep中显示可变数量的上下文,但是一个简短的awk语句可能会做你想要的。

如果您的示例文件名为file.dict

awk -v term="earth" 'BEGIN{IGNORECASE=1}{if($0 ~ "##"term){loop=1} if($0 ~ /^$/){loop=0} if(loop == 1){print $0}}' *.dict

返回:

##Earth
-planet

只需将变量term更改为您要查找的条目。

假设两件事:

  1. 字典文件具有相同的扩展名(.dict用于示例目的)
  2. 字典文件都在同一目录(调用命令的地方)

答案 2 :(得分:0)

如果你的grep支持perl正则表达式,你可以这样做:

grep -iPzo '(?s)##Berlin.*?\n(\n|$)'

有关此模式的更多信息,请参阅this answer

您也可以使用GNU这样做:

query=berlin
sed -n "/$query/I"'{ :a; $p; N; /\n$/!ba; p; }'

也就是说,当找到不区分大小写的$query时,打印直到找到空行(/\n$/)或文件末尾($p)。

两种情况下的输出(空白的微小差异):

##Berlin
-capital of Germany
-3.5 million inhabitants