0

我有类似“关键字:多节点”的模式。现在,我需要在目录中的所有文件中搜索此模式。如果我们在任何文件中找到该模式,则应返回一个非空字符串。它可能包含文件名或目录名

在 shell 脚本中,以下将执行相同的操作

关键节点=grep -w "keyword : Multinode" ${dirname}/*

我想过使用 find(subroutine,directory_path) 并在子例程中我想遍历整个目录以获取其所有条目。对于每个条目,我想检查它是否是可读文件。如果文件可读,我想在找到的文件中搜索所需的模式“关键字:多节点”。如果我们成功了,整个 find 命令应该会产生一个非空字符串(最好只有现有的目录名称),否则会产生一个空字符串。如果您需要任何进一步的信息,请告诉我。

我希望使用 perl 来完成。请帮我解决问题。

4

1 回答 1

0

以下是一些 Perl 工具,可用于执行您所描述的操作:

  • File::Find将对目录及其子目录中的文件进行递归搜索,\&wanted针对每个文件运行代码(文档中的回调)以确定它是否符合您的条件
  • 操作员会-r告诉您文件是否可读 ( if (-r $file_name)...)
  • open将让您访问该文件并<$fh>读取其内容,以便您可以使用正则表达式检查它们是否与您的目标模式匹配
  • 添加\b到模式的开头和结尾将导致它仅在单词边界处匹配,类似于grep's -wswitch

如果您有更具体的问题,请使用演示这些问题的代码发布其他问题,包括说明您预期会发生什么以及实际结果与您的预期有何不同,我们很乐意帮助解决这些问题。

编辑:从注释中清理和运行的代码版本:

#!/usr/bin/env perl    

use strict;
use warnings;
use 5.010;

use File::Find;

# Get $dirname from first command-line argument
my $dirname = shift @ARGV;

find(\&do_process, $dirname); # quotes around $dirname weren't needed

my ($KeyMnode, $KeyThreads);

sub do_process {
#  chomp($_); - not needed; $_ isn't read from a file, so no newline on it
  if (-r $_) {  # quotes around $_ weren't needed
    # $_ is just the final part of the file name; it may be better for
    # reporting the location of matches to set $file_name to 
    # $File::Find::name instead
    my $file_name = $_;
    open(my $fh, '<', $file_name);  # Use three-arg open!
    while (<$fh>) {
      chomp();
      # Note that, if you store all matches into the same scalar values,
      # you'll end up with only the last value found for each pattern; you
      # may want to push the matches onto arrays instead.
      if (/\bkeyword : Multinode\b/i) { $KeyMnode   = "$file_name:$_"; }
      if (/\bkeyword : Threads\b/i)   { $KeyThreads = "$file_name:$_"; }
    }
  }
}
于 2013-02-19T09:30:20.170 回答