在查找命令中对多种文件类型使用正则表达式



我目前正在使用

find . -name '*.[cCHh][cC]' -exec grep -nHr "$1" {} ; 
find . -name '*.[cCHh]' -exec grep -nHr "$1" {} ;

要在以 .c 结尾的所有文件中搜索字符串,.C, .h, .H、.cc 和 .CC 列在所有子目录中。但由于这包括两个命令,因此感觉效率低下。

如何使用单个正则表达式模式来查找 .c,。唰,唰,。H,.cc 和 .抄送文件?

我在 Linux 机器上使用 bash。

您可以使用布尔 OR 参数:

find . -name '*.[ch]' -o -name '*.[CH]' -o -name '*.cc' -o -name '*.CC'

上面的内容在当前目录和所有子目录中搜索以下列结尾的文件:

  • .c.h
  • .C.H
  • .cc
  • .CC.

这应该有效

混乱

find . -iregex '.*.(c|cc|h)' -exec grep -nHr "$1" {} +

-iregex不区分大小写的正则表达式模式。

(c|cc|h)(未显示讨厌的转义)匹配 C、CC 或 H 扩展名


干净

find -regextype "posix-extended" -iregex '.*.(c|cc|h)' -exec grep -nHr "$1" {} +

这将找到 .Cc和.cC扩展名也是如此。你已经被警告了。

此命令有效。

find -regextype posix-extended -regex '.+.(h|H|c{1,2}|C{1,2})$'

我希望我能使用iregex.iregex也会找到.Cc.cC.如果可以的话,命令将如下所示。只是短了一点。

find -regextype posix-extended -iregex '.+.(h|H|c{1,2})$'

find . -regex '.*.([chCH]|cc|CC)'
将找到名称以.c结尾的所有文件。唰,唰,。H,.cc 和 .CC 并且找不到任何以 .hc、.cC 或 .cc 结尾的内容。 在正则表达式中,前几个字符与名称中的最后一个句点匹配,括号中的替代项匹配单个字符 c、h、C 或 H 中的任何一个,或者 cc 或 CC 中的任何一个。

请注意,find 的-regex-iregex开关类似于-name-iname,但正则表达式类型的开关允许带有|的正则表达式进行替代匹配。 像-iname一样,-iregex不区分大小写。

find . -name '*.[cCHh][cC]?$'先前答案中给出的(非功能性)形式

没有列出我的 Linux 系统上的任何名称,GNU find 4.4.2。'*.[cCHh][cC]?$'作为正则表达式的另一个问题是,它将匹配不在 .c,集合中的abc.Ccxyz.hc等名称。唰,唰,。H,.cc 和 .所需的抄送文件。

相关内容

  • 没有找到相关文章