这是 grep -P 中的一个错误吗?(我似乎得到了太多的匹配)

这是 grep -P 中的一个错误吗?(我似乎得到了太多的匹配)

这是我的一份文件 http://www.zen76171.zen.co.uk/blahsomefile1

这是一个文本文件,大小约为 1.18MB

查看我得到了多少条匹配的行

使用 -P

C:\blah>grep -P "[^J]*J" blahsomefile1 | wc -l
72383

不带-P

C:\blah>grep "[^J]*J" blahsomefile1 | wc -l
51814

有无 -P 应该没什么区别,但实际是有区别的。-P 匹配太多了。

通过此测试,我应该得到相同的数字,因为我说列出与 xyz 匹配的每一行,并且在该输出中列出与 xyz 匹配的每一行。它无需 -P 即可工作。

如果没有 -P,就不会发生任何有趣的事情。

C:\blah>grep "[^J]*J" blahsomefile1 | wc -l
51814

C:\blah>grep "[^J]*J" blahsomefile1 | grep "[^J]*J" | wc -l
51814

由于 -P 的原因,一些不该发生的事情发生了......

C:\blah>grep -P "[^J]*J" blahsomefile1 | wc -l
72383


C:\blah>grep -P "[^J]*J" blahsomefile1 | grep -P "[^J]*J" | wc -l
72229

如果我做grep -P "[^J]*J" blahsomefile1 | more

txxxraabcAA 我发现它匹配了不应该匹配的东西,比如不包含 J 的那一行。

txxxJbmmabcraabc
txxxraabcAA
txxxJxmmabcHaabc

计算机正在运行 gnuwin32 grep

C:\blah>where grep
C:\Program Files (x86)\GnuWin32\bin\grep.exe

grep 版本是 2.5.4

C:\blah>"C:\Program Files (x86)\GnuWin32\bin\grep.exe" -V
GNU grep 2.5.4

Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.


C:\blah>

更新

有趣的是,cygwin 的版本要晚得多,而且没有这个 bug

C:\blah\aeea2\a\a\a\a>c:\cygwin\bin\grep -P "[^J]*J" blahsomefile1 | wc -l
51814

C:\blah>c:\cygwin\bin\grep -V
/usr/bin/grep (GNU grep) 2.21
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.

C:\blah>

gnuwin32 grep 仍为 2.5.4,一个非常旧的版本。

注意-文件也可用来自 wetransfer并可下载来自 ge.tt例如使用 Firefox。

答案1

这可能是 grep 2.5.4 中的一个错误

如果您可以在 gnuwin32 grep 或 cygwin grep 之间进行选择,那么 cygwin grep 是更为最新的。

-V 显示版本和年份,截至撰写本文时 -

gnuwin32 grep 是2.5.42009 年的版本。落后了好几年。

cygwin grep 比 gnuwin32 grep 领先数年。 2.21(晚于 2.5.4,因为 2.21 不像一个带有小数点的算术数字)并且 cygwin grep 的年份是 2014 年。

C:\blah>c:\cygwin\bin\grep -P "[^J]*J" blahsomefile1 | wc -l
51814

C:\blah>c:\cygwin\bin\grep -P "[^J]*J" blahsomefile1 | c:\cygwin\bin\grep -P "[^J]*J" | wc -l
51814

使用 cygwin grep (2014) 时未发现任何错误。

当 cygwin 版本的 grep 更新且更好时,这不是我第一次遇到 gnuwin32 版本的 grep 中的错误。与其他替代方案相比,gnuwin32 似乎非常过时。

相关内容