.png)
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.4
von 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.