Regex 搜索出现在同一文件中但可能不在同一行上的文件中的两个模式
从一个目录中,我需要找到所有包含十进制数字(比如42.7)和关键字“foo”或“goo”的文件。我怎样才能做到这一点 假设我有一个包含三个文件的目录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。什么是搜索命令来实现这一点 我寻找解决方案,但我所能找到的只是让模式
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