0

我的 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

大文件.txt:

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

如您所见,BigFile 应该完全匹配。相反,它在大约 32k 个字符后停止,大约在第 1880 行。

我正在使用 Grep2.5.1。我最好的猜测是这个版本的 grep 只能匹配模式中的大约 2^15=32768 个字符......

作为比较,在另一台运行 grep 2.6.3 的机器上,以下工作正常

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

1 回答 1

1

您在一个命令中使用了非贪婪运算符:

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

另一个是贪婪的运算符:

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

这可能会导致grep文件匹配方式的差异。

于 2013-10-29T16:26:18.083 回答