Ist das ein Fehler in grep -P? (Ich scheine zu viele Übereinstimmungen zu erhalten)

321
barlop

Hier ist eine Datei, die ich unter http://www.zen76171.zen.co.uk/blahsomefile1 habe

Es handelt sich um eine Textdatei mit einer Größe von etwa 1,18 MB

Schau dir an, wie viele passende Zeilen ich bekomme

Mit P

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

Ohne -P

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

Es sollte keinen Unterschied geben, ob -P oder ohne -P, aber es gibt einen Unterschied. Das -P passt zu sehr.

Bei diesem Test sollte ich die gleiche Zahl erhalten, weil ich sage, dass jede Zeile, die mit xyz übereinstimmt, und jede Zeile, die mit xyz übereinstimmt, in dieser Ausgabeliste aufgeführt ist. Es funktioniert ohne -P.

Ohne -P passiert nichts komisches.

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

Mit -P passiert Dinge, die nicht passieren dürfen ..

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

Wenn ich mache grep -P "[^J]*J" blahsomefile1 | more

Ich sehe, dass es Dinge sind, die nicht übereinstimmen sollten, wie etwa die Zeile, die liest, txxxraabcAA die kein J enthält.

txxxJbmmabcraabc txxxraabcAA txxxJxmmabcHaabc 

Computer läuft mit gnuwin32 grep

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

Grep-Version ist 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> 

AKTUALISIEREN

Interessanterweise ist der von Cygwin viel später ... und hat den Fehler nicht

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 ist immer noch auf 2.5.4, einer sehr alten Version.

Die Notizdatei ist auch von wetransfer verfügbar und kann von ge.tt mit z. B. firefox heruntergeladen werden .

0
Ich kann dieses Problem unter Linux nicht mit der aktuellen Version von GNU grep: 2.26 reproduzieren. Vielleicht möchten Sie herausfinden, ob Sie Ihre Software aktualisieren können: [Version 2.5.4 bis 2009] (http://ftp.gnu.org/gnu/grep/) John1024 vor 7 Jahren 1

1 Antwort auf die Frage

0
barlop

Dies kann ein Fehler in grep 2.5.4 sein

Wenn Sie zwischen gnuwin32 grep oder cygwin grep wählen können, ist cygwin grep weitaus aktueller.

-V zeigt Version und Jahr, und das wie schriftlich -

gnuwin32 grep ist Version 2.5.4, die 2009 liegt. Jahre hinterher.

cygwin grep ist gnuwin32 grep um Jahre voraus. 2.21(das ist später als 2.5.4, da 2.21 nicht wie eine arithmetische Zahl mit Dezimalpunkt ist) und das Jahr von cygwin's grep ist 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 

Sehen Sie dort keinen Fehler mit cygwin grep, was 2014 ist.

Dies ist nicht das erste Mal, dass ich auf einen Fehler in der gnuwin32-Version von grep gestoßen bin, als die cygwin-Version von grep viel später und in Ordnung war. gnuwin32 scheint im Vergleich zu Alternativen sehr veraltet zu sein.