Это ошибка в grep -P? (Кажется, у меня появляется слишком много совпадений)

Это ошибка в grep -P? (Кажется, у меня появляется слишком много совпадений)

Вот файл, который у меня есть 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.42009 года. На годы отстает.

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, похоже, сильно устарел по сравнению с альтернативами.

Связанный контент