如何使用“grep”在 PHP 文件中搜索字符串?

如何使用“grep”在 PHP 文件中搜索字符串?

我正在一个包含数百个 PHP 文件的网站上搜索类声明。如何使用grep

我测试了cd文件夹然后像

grep -r 'class MyClass' *.php

答案1

你可以试试

grep -r --include=*.php "search string" /path/to/dir

答案2

我建议你使用类似标签而不是使用 grep。但是,如果你愿意,你可以这样做

 find <top level dir> -name \*.php | xargs grep "class MyClass"

class当然,这是假设和之间只有一个空格,myClass但这可能不是事实。不过,很容易更改正则表达式以查找任意数量的空格。

答案3

如果你使用-r,你可能只想递归搜索当前目录

grep -r 'class MyClass' .

请注意上面末尾的句号。

你所说的grep是,你希望它递归搜索每个*.php文件或目录,但您可能没有任何以 .php 扩展名结尾的目录。以上是进行搜索的最简单的方法,但也包括其他类型的文件,这在您到处都有 .svn 目录时尤其成问题。如果您没有很多其他文件类型,则上述方法通常就足够了,并且效果很好。

大多数 grep 版本都没有办法指定可以搜索的文件扩展名,因此通常将 find 与它结合使用:

find <startDir> -iname '*.php' -exec grep 'class[ \t]*MyClass' {} \;

-iname告诉某些版本的 grep 您想要执行不区分大小写的文件名搜索,但许多非 GNU 版本的 find 不支持它,因此您可以改用-name

上述-exec选项的副作用是针对每个文件调用 grep,这是相当昂贵的。

还有其他版本的 grep 支持 a,+它告诉 find 将参数附加在一起以减少可执行文件的调用次数:

find <startDir> -iname '*.php' -exec grep 'class[ \t]*MyClass' {} + \;

经常推荐的减少调用的方法是使用 xargs,它将尽可能少地触发 grep,但会根据需要多次触发:

find <startDir> -iname \*.php | xargs grep "class[ \t]*MyClass"

xargs足够智能,可以将 grep 传递给命令行支持的最大参数数量,但上述变体不能很​​好地处理某些字符,如空格。例如,如果文件名为“the file.php”,则 grep 将接收“the”作为参数,并将“file.php”作为参数,因此不会同时找到这两个参数。相反,我们使用:

find <startDir> -iname \*.php -print0 | xargs -0 grep "class[ \t]*MyClass"

print0-0一起工作并使用后跟空字符的参数,以便完整且明确地识别参数。

如果在 或制表符后有多个空格class,则可能需要通过更改正则表达式来允许更多字符:class[ \t]*MyClass

这个帖子StackOverflow 上有其他示例,并演示了如何排除某些目录,例如 .svn 目录。

答案4

grep -r 'class MyClass' *.php

将搜索所有名称以 .php 结尾的文件夹

grep -r 'class MyClass' . | grep .php

将在所有子文件夹中的所有文件中搜索类 MyClass,然后仅返回其中包含 .php 的文件。

相关内容