.png)
Вот файл, который у меня есть http://www.zen76171.zen.co.uk/blahsomefile1
Это текстовый файл размером около 1,18 МБ.
Смотря, сколько совпадающих строк я получаю.
С -П
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.5.4, поскольку 2.21 не похожа на одно арифметическое число с десятичной точкой), а годом создания 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
Никаких ошибок не обнаружено при использовании cygwin grep (2014).
Это не первый раз, когда я сталкиваюсь с ошибкой в версии grep для gnuwin32, хотя версия grep для cygwin была намного более поздней и работала нормально. gnuwin32, похоже, сильно устарел по сравнению с альтернативами.