이것은 grep -P의 버그입니까? (너무 많은 경기가 나타나는 것 같습니다)

이것은 grep -P의 버그입니까? (너무 많은 경기가 나타나는 것 같습니다)

여기 내가 가지고 있는 파일이 있습니다 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에서예를 들어 파이어폭스와 함께.

답변1

grep 2.5.4의 버그일 수 있습니다.

gnuwin32 grep 또는 cygwin grep 중에서 선택할 수 있다면 cygwin grep이 훨씬 더 최신 버전입니다.

-V는 버전과 연도를 표시하며, 이는 작성 당시 -

gnuwin32 grep은 2.5.42009년 버전입니다. 몇 년 뒤진 버전입니다.

cygwin grep은 gnuwin32 grep보다 몇 년 앞서 있습니다. 2.21(2.21은 소수점이 있는 하나의 산술 숫자와 같지 않기 때문에 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에는 오류가 없습니다.

grep의 cygwin 버전이 훨씬 나중이고 괜찮았을 때 gnuwin32 버전의 grep에서 버그가 발생한 것은 이번이 처음이 아닙니다. gnuwin32는 대안에 비해 매우 오래된 것 같습니다.

관련 정보