为什么这" grep -P"不按我的意愿行事?

时间:2015-06-30 03:56:48

标签: regex grep gnu

$ cat file
Here's a line.

This line has one blank line above it.


This line has two blank lines above it.



This line has three blank lines above it.




This line has four blank lines above it.

我想在文本文件中找到前面有两个或多个空行的所有行。我相信应该执行此操作的命令只会找到前面有两行空行的行:

$ grep -Pzo '(?<=\n\n\n).*' file 
This line has two blank lines above it.

grep手册页(对于GNU grep 2.21)确实将-P选项标记为&#34;高度实验&#34;,但声称主要问题是未实现的行为,它将发出警告。但是,乍一看,这似乎是错误的行为:我无法解释为什么之前出现正则表达式的后视部分会影响表达式是否匹配。我在这里忽略了一些微妙之处吗?

我找到了其他方法来实现我想要的东西,所以我真的不需要任何建议。但是,这个grep命令是最优雅的解决方案(除了它不能工作的轻微不便),我想了解它失败的原因,以及它是否可以调整成功。感谢。

1 个答案:

答案 0 :(得分:2)

在对PCRE库进行一些调查和修改之后,我实际上发现这种不正确的行为是由grep本身引起的。

grep 2.21似乎是第一个不能正常工作的版本,例如:

➜  ~  grep-2.21/src/grep -Pzo '(?<=\n\n\n).*' ~/file 
This line has two blank lines above it.

➜  ~  grep-2.20/src/grep -Pzo '(?<=\n\n\n).*' ~/file
This line has two blank lines above it.
This line has three blank lines above it.
This line has four blank lines above it.

根据grepgit repository),自2.20以来引入了一些变化。

总而言之,这是一个错误,应该报告。