2013-10-29 31 views
0

我的perl-grep語句不捕獲大匹配(~32k字符)的所有元素,但對於較小的匹配沒有問題。Perl-grep在32k個字符後停止匹配

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:

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

正如你可以看到,大文件應在其整體匹配。相反,它約在3280字符後停止,大約在1880行。

我正在使用Grep2.5.1。我最好的猜測是,這個版本的grep只能匹配從圖案中約2^15 = 32768個字符...

爲了比較,運行grep的2.6.3另一臺機器上,下面的工作正常

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