これは 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 のものはずっと後ですが、バグはありません。

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.21 は小数点付きの 1 つの算術数字ではないため、2.5.4 より新しいです) また、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

2014 年の cygwin grep ではエラーは発生しません。

cygwin バージョンの grep の方がずっと新しくて問題なかったのに、gnuwin32 バージョンの grep でバグに遭遇したのは今回が初めてではありません。gnuwin32 は、他のバージョンと比べるとかなり古いようです。

関連情報