.png)
ここに私が持っているファイルがあります 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.4
2009 年のバージョンです。何年も遅れています。
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 は、他のバージョンと比べるとかなり古いようです。