Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.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
Regex 搜索出现在同一文件中但可能不在同一行上的文件中的两个模式_Regex_Linux_Shell_Grep - Fatal编程技术网

Regex 搜索出现在同一文件中但可能不在同一行上的文件中的两个模式

Regex 搜索出现在同一文件中但可能不在同一行上的文件中的两个模式,regex,linux,shell,grep,Regex,Linux,Shell,Grep,从一个目录中,我需要找到所有包含十进制数字(比如42.7)和关键字“foo”或“goo”的文件。我怎样才能做到这一点 假设我有一个包含三个文件的目录 file1.txt ======= double x = 2.7 foo(); file2.txt =========== double u = 5.7 file3.txt =========== goo(42.0); 搜索命令应给出file1.txt和file3.txt。什么是搜索命令来实现这一点 我寻找解决方案,但我所能找到的只是让模式

从一个目录中,我需要找到所有包含十进制数字(比如42.7)和关键字“foo”或“goo”的文件。我怎样才能做到这一点

假设我有一个包含三个文件的目录

file1.txt
=======
double x = 2.7
foo();

file2.txt
===========
double u = 5.7

file3.txt
===========
goo(42.0); 
搜索命令应给出file1.txt和file3.txt。什么是搜索命令来实现这一点


我寻找解决方案,但我所能找到的只是让模式同时出现在同一条线上。我也很难处理小数点。

使用2
grep-l
命令列出包含正则表达式的文件名(而不是匹配的行)。通过
xargs
连接它们,例如:

grep -Pl '(\d+[.]?\d*|\d*[.]?\d+)' file?.txt | xargs grep -Pl '(foo|goo)'
例如:

创建输入文件。除了问题中列出的示例之外,我还使用了一些示例来说明找到的模式/文件:

cat > file1.txt <<EOF
double x = 2.7
foo();
EOF

cat > file2.txt <<EOF
double u = 5.7
EOF

cat > file3.txt <<EOF
goo(42.0);
EOF

cat > file4.txt <<EOF
foo(4);
EOF

cat > file5.txt <<EOF
goo(.42);
EOF

cat > file6.txt <<EOF
goo(.);
EOF
印刷品:

file1.txt
file3.txt
file4.txt
file5.txt
在这里,
grep
使用以下选项:
-P
:使用Perl正则表达式。
-l
:仅列出文件名,不列出匹配行

正则表达式包含以下部分:
\d*
:任何数字0-9,重复0次或更多次。
\d+
:相同,重复1次或多次。
[.]
:文字点(
)。否则,在不转义的情况下,
表示任何字符

另请参见:

-l

--具有匹配项的文件

抑制正常输出;而是从中打印每个输入文件的名称 通常打印的输出。扫描每个 文件在第一次匹配时停止。(
-l
由POSIX指定。)


我在任何地方都看不到
42.7
,任何文件如何匹配它?关于“小数点”--您尝试过转义它吗?(在bash和regex中?--这应该已经在某个地方得到了回答)谢谢。为什么要使用Perl正则表达式?它是标准的吗?@zell Perl regex不是标准的,但它是GNU grep的一个选项。我喜欢它,因为它通常更容易编写和维护。但是,如果您愿意,可以使用标准正则表达式重写它。
file1.txt
file3.txt
file4.txt
file5.txt