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

264
barlop

Вот файл, который у меня есть http://www.zen76171.zen.co.uk/blahsomefile1

Это текстовый файл размером около 1,18 МБ

Смотря на сколько совпадающих строк я получаю

С -P

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

Без -P

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

Не должно быть разницы, -P или без -P, но есть. -P слишком много соответствует.

С помощью этого теста я должен получить ту же цифру, потому что я говорю список каждой строки, которая соответствует xyz, и в этом списке вывода каждая строка, которая соответствует xyz. Работает без -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 

Компьютер работает GNU Gnuwin32

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.

0
Я не могу воспроизвести эту проблему в Linux, используя текущую версию GNU grep: 2.26. Возможно, вы захотите узнать, можете ли вы обновить свое программное обеспечение: [версия 2.5.4 датируется 2009 годом] (http://ftp.gnu.org/gnu/grep/) John1024 7 лет назад 1

1 ответ на вопрос

0
barlop

Это может быть ошибка в grep 2.5.4

Если у вас есть выбор между gnuwin32 grep или cygwin grep, cygwin grep будет гораздо более современным.

-V показывает версию и год, и что на момент написания -

gnuwin32 grep - это версия 2.5.42009 года.

greg cygwin на годы опережает grep gnuwin32. 2.21(это позже, чем 2.5.4, потому что 2.21 не похож на одно арифметическое число с десятичной запятой), а год greg cygwin - 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.

Это не первый раз, когда я сталкиваюсь с ошибкой в ​​gnuwin32-версии grep, когда cygwin-версия grep была намного позже и в порядке. Gnuwin32, кажется, очень устарел по сравнению с альтернативами.