Ist das ein Fehler in grep -P? (Es scheinen zu viele Übereinstimmungen angezeigt zu werden)

Ist das ein Fehler in grep -P? (Es scheinen zu viele Übereinstimmungen angezeigt zu werden)

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

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

Ich schaue, wie viele übereinstimmende 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 machen, ob mit oder ohne -P, aber das ist nicht der Fall. Das -P passt zu sehr.

Mit diesem Test sollte ich die gleiche Zahl erhalten, weil ich sage, dass jede Zeile aufgelistet wird, die mit xyz übereinstimmt, und dass innerhalb dieser Ausgabe jede Zeile aufgelistet wird, die mit xyz übereinstimmt. Es funktioniert ohne -P.

Ohne -P passiert nichts Lustiges.

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

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

Mit -P passieren Dinge, die nicht passieren sollten.

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 machegrep -P "[^J]*J" blahsomefile1 | more

Ich sehe, dass es mit Dingen übereinstimmt, mit denen es nicht übereinstimmen sollte, wie beispielsweise die Zeile, die lautet, txxxraabcAA dass sie kein J enthält.

txxxJbmmabcraabc
txxxraabcAA
txxxJxmmabcHaabc

Auf dem Computer wird gnuwin32 grep ausgeführt.

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

Die 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 Cygwins Version 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.

Hinweis: Die Datei ist auch verfügbarvon wetransferund herunterladbarvon ge.ttmit zB Firefox.

Antwort1

Dies könnte ein Fehler in grep 2.5.4 sein

Wenn Sie die Wahl zwischen gnuwin32 grep oder cygwin grep haben, ist cygwin grep weitaus aktueller.

-V zeigt die Version und das Jahr an, und zwar zum Zeitpunkt des Schreibens -

gnuwin32 grep ist die Version 2.5.4von 2009. Jahre zurück.

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 einem Dezimalpunkt ist.) Und das Jahr von Cygwins 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

Es tritt kein Fehler mit Cygwin Grep auf, also 2014.

Dies ist nicht das erste Mal, dass ich auf einen Fehler in der GnuWin32-Version von Grep gestoßen bin, während die Cygwin-Version von Grep viel neuer und einwandfrei war. GnuWin32 scheint im Vergleich zu Alternativen sehr veraltet zu sein.

verwandte Informationen