¿Es esto un error en grep -P? (Parece que aparecen demasiadas coincidencias)

¿Es esto un error en grep -P? (Parece que aparecen demasiadas coincidencias)

Aquí hay un archivo que tengo. http://www.zen76171.zen.co.uk/blahsomefile1

Es un archivo de texto de aproximadamente 1,18 MB de tamaño.

Mirando cuántas líneas coincidentes obtengo

Con p

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

Sin -P

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

No debería haber diferencia entre -P o sin -P, pero la hay. El -P coincide demasiado.

Con esta prueba debería obtener la misma cifra porque estoy diciendo que enumere cada línea que coincida con xyz y dentro de esa lista de salida cada línea que coincida con xyz. Funciona sin -P.

Sin -P no pasa nada gracioso.

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

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

Con -P suceden cosas que no deberían estar sucediendo.

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


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

Si lo hagogrep -P "[^J]*J" blahsomefile1 | more

Veo que coincide con cosas que no debería coincidir, como la línea que dice txxxraabcAA que no contiene J.

txxxJbmmabcraabc
txxxraabcAA
txxxJxmmabcHaabc

La computadora está ejecutando gnuwin32 grep

C:\blah>where grep
C:\Program Files (x86)\GnuWin32\bin\grep.exe

La versión de grep es 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>

ACTUALIZAR

Curiosamente el de cygwin es mucho posterior... y no tiene el error

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 todavía está en 2.5.4, una versión muy antigua.

Nota: el archivo también está disponiblede wetransfery descargablede ge.ttcon, por ejemplo, Firefox.

Respuesta1

Esto puede ser un error en grep 2.5.4

Si puede elegir entre gnuwin32 grep o cygwin grep, cygwin grep está mucho más actualizado.

-V muestra la versión y el año, y eso al momento de escribir este artículo -

gnuwin32 grep es la versión 2.5.4de 2009. Años de retraso.

cygwin grep está años por delante de gnuwin32 grep. 2.21(eso es posterior a 2.5.4 porque 2.21 no es como un número aritmético con un punto decimal) y el año del grep de cygwin es 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

No veo ningún error allí con cygwin grep que es 2014.

Esta no es la primera vez que me encuentro con un error en la versión gnuwin32 de grep cuando la versión cygwin de grep era mucho posterior y estaba bien. gnuwin32 parece estar muy desactualizado en comparación con otras alternativas.

información relacionada