这是我的一份文件 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.4
2009 年的版本。落后了好几年。
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 似乎非常过时。