2013-10-29 3 views
0

내 perl-grep 문이 큰 일치 (~ 32k 문자)의 모든 요소를 ​​캡처하지는 않지만 더 작은 일치에는 문제가 없습니다.Perl-grep이 32k 문자 뒤에 일치하지 않습니다.

I 잡아 위해 사용할 grep 명령 "허용 [< TEXT>]"파일이 큰 틱이라면 어떤 이유

grep -P '(?si)^\s*allowed\s*\[.*?\]' file.txt 

는 도트가 대응하는 행을 멈춘다. 그러므로 '. *? \]'는 ']'를 찾기에 충분하지 않기 때문에 위의 grep은 아무 것도 맞지 않습니다.

grep -P '(?si)^\s*allowed\s*\[.*' bigFile.txt | wc 
1883 1883 32764 

하지만 여전히 사용하여 전체 파일을 소비 할 수 있습니다 *.

grep -P '(?si).*' bigFile.txt | wc 
10003 10003 178910 

BigFile.txt을 : 당신이 볼 수 있듯이, TEST_TBS는 빅이 전체를

allowed 
    [ 
     com.bar.baz1 
     com.bar.baz2 
     .... 
     com.bar.baz10000 
    ] 

일치해야한다 . 대신 줄을 약 1880에서 약 32k 문자를 중지합니다.

나는 Grep2.5.1 사용하고 있습니다. 내 추측이 그렙의이 버전은 그렙 2.6.3 실행하는 다른 컴퓨터에서, 패턴 내에서 약 2^15 = 32768 문자 ... 비교를 위해

일치 할 수 있다는 것입니다, 다음은 잘 작동

grep -Pzo '(?si)^\s*allowed\s*\[.*?\]' bigFile.txt 

답변

1

는 한 명령이 아닌 욕심 연산자를 사용하고 있습니다 :

grep -P '(?si)^\s*allowed\s*\[.*?\]' file.txt 
           ^^ 

와 다른 욕심 운영자 :

grep -P '(?si)^\s*allowed\s*\[.*' bigFile.txt | wc 
          ^

grep이 파일과 일치하는 방식에 차이가 발생할 수 있습니다.

+0

참. 그러나 나는 내가 보는 이슈를 보여주고 자 노력 중이다. ". *"가 모든 행과 일치하지 않으면 ". *? \\]"는 (는) ''을 (를) 찾기에 충분할만큼 먹을 수 없으므로 절대로 일치하지 않습니다. – user2588491

관련 문제