Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在find命令中对多种文件类型使用regex_Regex_Bash_File Extension - Fatal编程技术网

在find命令中对多种文件类型使用regex

在find命令中对多种文件类型使用regex,regex,bash,file-extension,Regex,Bash,File Extension,我目前正在使用 find . -name '*.[cCHh][cC]' -exec grep -nHr "$1" {} ; \ find . -name '*.[cCHh]' -exec grep -nHr "$1" {} ; 在所有子目录中以.c、.c、.h、.h、.cc和.cc结尾的所有文件中搜索字符串。但由于这包括两个命令,因此感觉效率低下 如何使用单个正则表达式模式查找.c、.c、.h、.h、.cc和.cc文件 我正在Linux机器上使用bash。您可以使用布尔或参数: find .

我目前正在使用

find . -name '*.[cCHh][cC]' -exec grep -nHr "$1" {} ; \
find . -name '*.[cCHh]' -exec grep -nHr "$1" {} ;
在所有子目录中以.c、.c、.h、.h、.cc和.cc结尾的所有文件中搜索字符串。但由于这包括两个命令,因此感觉效率低下

如何使用单个正则表达式模式查找.c、.c、.h、.h、.cc和.cc文件


我正在Linux机器上使用bash。

您可以使用布尔或参数:

find . -name '*.[ch]' -o -name '*.[CH]' -o -name '*.cc' -o -name '*.CC'
上述操作将在当前目录和所有子目录中搜索以以下内容结尾的文件:

  • .c
    .h
  • .C
    .H
  • .cc
  • .CC
查找-正则表达式“*\”([chCH]\\\\\\\\\\\\\)”

将查找名称以.c、.c、.h、.h、.cc和.cc结尾的所有文件,但找不到任何以.hc、.cc或.cc结尾的文件。在正则表达式中,名称中的前几个字符与最后一个句点匹配,括号中的可选字符与任何单个字符c、h、c或h匹配,或者与cc或cc匹配

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

(非功能性)表格
find-名称“*[cCHh][cC]?$”

在前面的回答中没有列出我的linux系统上GNU find 4.4.2的任何名称。
*.[cCHh][cC]?$作为正则表达式的另一个问题是,它将匹配像
abc.cC
xyz.hc
这样的名称,这些名称不在所需的.c、.c、.h、.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})$'

顺便说一句,
-name
的参数不是正则表达式,而是shell扩展。第一种形式不起作用,因为
$
不是shell模式,所以它们会被解释literally@rid,我编辑后指出,
-iregex.*\.[ch]\\\\\.*.cc'
与.ch不匹配。但是,我同意它匹配.Cc和.Cc,并为精确的扩展集添加了一个“-regex”,这比尝试使用regex要优雅得多。如果您想添加“-exec”,这是行不通的。例如,“find-name*.log'-o-name*.txt-exec cat'{}\”,它只执行第一个名称,如果出于某种原因,您没有意识到它是
-o
@OutputLogic,使用
find
s优先级运算符(和)处理这个问题,例如
find\(.name”*.log“-o-name”*.txt”\)-exec cat{}
应该意味着
-exec
可以按预期工作。rid--您介意更新您的答案吗,这样普通读者就不会错过Briggs的观点了?