如果Perl中的文件中存在特定的正则表达式,如何获取文件名

时间:2012-02-24 09:07:16

标签: regex perl format filenames cpan

在包含许多文件的目录中,如果在文件中找到特定的正则表达式(或格式),请获取该文件名

示例:

  1. 如果在名为ramayana的文件中找到“rama”字样,则打印文件名“ramayana”
  2. 如果文件在名为table的文件名中包含类似“(TEXT - NUMBERS)”的特定格式,则打印该文件名表
  3. 在shell中很容易,比如

    grep“mytext”* | cut -d':' - f1 | uniq的

    但是如何在perl

    中执行此操作

    建议我是否有任何特定的CPAN模块有助于此

    Thankss

2 个答案:

答案 0 :(得分:3)

你的例子听起来比你的shell单行更复杂。这相当于perl中的单行:

perl -nlwe 'if (/mytext/) { print $ARGV; close ARGV }' *

-n打开文件并阅读内容。 -l添加换行符(为方便起见)。如果找到文本,我们关闭文件句柄以避免打印多个匹配项。如果要处理更多文件,它将再次打开。

答案 1 :(得分:1)

perl -ne 'END { print join("\n", sort keys %found)} if (/PATTERNTOMATCH/) {$found{$ARGV[0]}=1;}' *

我的第一次尝试是:

perl -ne 'if (/PATTERNTOMATCH/) {print "$ARGV[0]\n";}' *

但是如果它在文件中匹配多次,则会打印出多个文件名。为了停止显示欺骗,我试图使用'last'来打破隐式循环,但它似乎不起作用。所以最好的例子是,只要找到匹配项就将文件名放入哈希值(if(/ PATTERNTOMATCH ...)然后在END块中(在开头!),它会从哈希中打印出键(要删除)重复的文件名)。

我害怕这有点可怕。我坚持使用DavidO上面提到的CPAN模块