搜索或查找包含字符串或模式匹配的文件

时间:2013-02-06 00:47:55

标签: regex perl pattern-matching

如果不使用任何Perl模块,可以在Perl中执行以下操作,只需要几行代码吗?

find . -type f | xargs grep -l "2000.*Created" | cut -c3-100

上面只给出了包含“2000. * Created”的文件的文件名。我想在Perl中执行此操作并将结果推送到数组(文件名数组)。

我发现Perl File :: Finder模块具有类似的功能,但在我目前的工作环境中,我无法访问或下载任何模块。

可以用一行或两行代码完成吗?

2 个答案:

答案 0 :(得分:1)

当然有可能。

perl -MFile::Find -lwe '
    find(sub { -f && push @ARGV, $File::Find::name }, '.'); 
    while(<>) { if (/2000.*Created/) { print substr($ARGV,2); close ARGV; } }'

File::Find是一个核心模块,因此它应该已经存在于您的系统中。 find子例程将查找所有常规文件并将其推送到@ARGV,以便我们可以使用菱形运算符读取它们。然后我们循环检查使用正则表达式检查内容的文件。如果找到,我们打印文件名而不包含前2个字符(我假设它等同于cut -c3-100)。 close ARGV行是短路以防止多次匹配。

答案 1 :(得分:0)

我喜欢File :: Find这个例子更好 - 它更便携,File :: Find可以做一些非常漂亮的东西。但是,我会提到一种方法,这种方法对于没有内置支持的其他命令很有用。

open F,'find . -type f | xargs grep -l "2000.*Created" | cut -c3-100 |' || die 'cannot execute';
while(<F>) { chomp ; push(@a,$_)}

请注意打开的管道(|)...这很重要,因为Perl会自动完成为您连接管道的所有工作。

这也可以使用较新的3参数open:

编写
open my $fh, '-|', 'find . -type f | xargs grep -l "2000.*Created" | cut -c3-100' || die 'cannot execute';
while(<$fh>) { chomp ; push(@a,$_)}

作为旁注,如果您的文件名包含空格,find | xargs会出现问题。您可以使用-print0上的find操作和-0上的xargs标记解决此问题:

find . -type f -print0 | xargs -0 -l "2000.*Created" | cut -c3-100