【发布时间】:2014-10-14 19:11:35
【问题描述】:
我正在尝试 grep 包含类名的所有文件,例如:
$ grep -ER "(^| )class [^ ]*" .
我认为(^| ) 会包含either whitespace or newline,但它显示了 cmets 中的所有类词,例如:
./includes/bootstrap.inc: * The name of the class to check or load.
还有下面的例子:
grep -ER "(^|\?abstract)class [^ ]*" .
实际上不包含任何抽象类文件。
基本上我正在尝试执行正则表达式,例如:
- 新行或空格。
- 可选字
abstract。 -
class姓名(单词)。 - 后面有空格。
- 任何实际的类名(单词)。
所以正则表达式会在以下几行做出反应:
class Entity {
class Entity {
class NoFieldsException extends Exception {}
abstract class CacheArray implements ArrayAccess {
但不适用于这些:
* This class should be extended by systems that need to cache large amounts
设置测试环境:
$ curl -o- http://ftp.drupal.org/files/projects/drupal-7.31.tar.gz | tar zxf - && cd drupal-7*
$ grep -ER "(^| )class [^ ]*" . | less
$ grep -ER "(^|\?abstract)class [^ ]*" . | wc -l
653 # But this doesn't include ./includes/bootstrap.inc:abstract class DrupalCacheArray
示例用例:
- 如果 Drupal CMS 类注册表损坏,the table needs to be rebuilt,因此需要将包含类的所有可用文件导入 SQL 表中。
【问题讨论】:
-
您应该使用之前的正则表达式来清除 cmets、非 php 部分和字符串。那么提取类名就很简单了。
-
这永远不会可靠地工作。可能的故障点太多。另一种策略呢:查找所有文件,然后依次包含,如果成功比较文件加载前后定义的类列表。应该更精确,但速度较慢。
-
很难说具体的行是否是评论本身,因为可能包含
*,或者不能。所以在class字之前排除多个字或仅限于一个特殊字(例如abstract)我认为应该做得更好。
标签: php regex command-line grep