如何使用pcregrep检查重复字符串的长文件

时间:2015-04-11 02:03:47

标签: regex linux bash pcregrep

这是我在这里的第一篇文章,这是一个很棒的地方,对我有很大帮助!

所以我使用pcregrep,我想用我的模板捕获文件。 我正在使用变量来表示正则表达式:

test="<\?php\n.*. = Array\(('.'=>'.', ){20,}.*\);\nfunction .*\(.*, .*\).*for\(.i=0; .i .*\nreturn base64_decode(.*);}\n.* ('.*'.\n){10,}.*"

然后搜索文件:

find . -type f -name "*.php1" -print0 | xargs -0 pcregrep --colour=auto -M "$test"

你可以在这里找到我想要匹配的test.sh(我正在使用的bash文件)和* .php1文件: http://sendrev.com/stackoverflow/

当我运行sh test.sh时,它总是找到行(我看到它的颜色,因为我使用--colour=auto):

'yzr3YEca5VacRthC6tGoXNkS2n8S2n8S2n8S2n8S2n8S4wUSFBc9FhGcqtcP6JTk4J0kj5TOMZ0yYmL'. 

(或其他,但不显示文件末尾)

我无法匹配更多的线条,我无法理解为什么。 我希望将最后一行与以下内容匹配:

"eval\(.*(.*, .*\)\);\?>$"

"\)\);\?>"

但我无法进入那条线。 如果我添加&#34;)); \?&gt;&#34;结束&#34;测试&#34;变量没有找到,因为它无法进入最后一行。

!!! Importnat是指如果'.*'.的行少得多,那么一切都没问题。它看起来有一些我无法理解的限制。

如果你有CentOS或其他Linux发行版,你可以测试它。

请帮助我帮忙寻找错误? 感谢。

1 个答案:

答案 0 :(得分:0)

好的,我找到了另一种解决方案(grep)这种类型的搜索而不改变正则表达式:
find . -type f -name "*.php" -print0 | xargs -0 grep --colour -Pzo "$test1"

说明:
-P为grep激活perl-regexp(常规扩展的强大扩展)
-z在行尾压缩换行符,将其替换为空字符。
即,grep知道行尾的位置,但将输入视为一个大行。
-o仅打印匹配。

我认为这对我来说没问题,但是为什么它不适用于pcregrep是个谜。