【问题标题】:Search directory for files with specific string and print location搜索具有特定字符串和打印位置的文件的目录
【发布时间】:2014-07-05 12:52:07
【问题描述】:

我需要创建一个 perl 脚本,该脚本将搜索给定目录并查找包含特定字符串的所有 txt 文件。我希望 perl 脚本然后打印这些文件的位置。到目前为止,我已经完成了这项任务,但我想在脚本中添加更多功能。

这是我目前所拥有的:

#!/usr/bin/perl
use strict;
use warnings;
use File::Find;

my $dir ='C:\path\to\dir';
my $keyword = "apple";


find(\&txtsearch, $dir);

sub txtsearch {

   if(-f $_ && $_ =~ /\.txt$/) { 
       open my $file, "<", $_ or do {
           warn qq(Unable to open "$File::Find::name": $!); #checks permissions
           return;
       };

       while(<$file>) {
           if (/\Q$keyword\E/) {  
               print "$File::Find::name\n"; #prints location of file
               return; #stops searching once found             
           }
      }
   } 
}

现在我想补充几点: 首先,我想包括一种在搜索中包含大写的方法。例如,如果我想查找单词“apple”的所有实例,我不希望它忽略“Apple”或“APPLE”的任何用法。

我也想成为苹果在命令行中输入关键字而不是实际脚本本身。

另外,是否可以让脚本在名为“output.txt”的指定目录中创建一个文件并将脚本的输出导入其中?我知道一个命令行,你必须有类似 > output.txt 的东西,但我不完全确定如何在脚本中实现它。

最后,如果我能打印出该字符串在文件中出现的次数,那就太好了。例如,如果单词“apple”在文本文件中出现 5 次,我想查看文件位置的输出,以及类似“apple 在 FILE.txt 中出现 5 次”的输出

非常感谢您的帮助!

【问题讨论】:

  • 我发现“到目前为止我已经完成了这项任务”这句话加上 perl 101 问题以及脚本中使用的内置函数和关键字既可疑又有趣
  • 一方面,你会因为试图找到一个你想要的脚本而受到赞扬。另一方面,诚实地承认你找到了别人的脚本,但根本不了解它是如何工作的,因此即使是最基本的功能也无法理解如何添加,这样会产生更多的好感和更少的负面反应。跨度>
  • 我很抱歉,我并不是要暗示我自己编写了整个脚本,我从几个完成相同事情的脚本中借用了属性。我的问题是基于更多关于修改脚本和添加更多功能的问题。我是一个完整的新手,想学习 perl,我了解非常基础的知识,但通过示例学习。对脚本部分的任何功能的任何解释都将不胜感激。非常感谢,如果我走错了对不起!

标签: string perl file search


【解决方案1】:

首先,我想包括一种在搜索中包含大写字母的方法。例如,如果我想查找单词“apple”的所有实例,我不希望它忽略“Apple”或“APPLE”的任何用法。

i 修饰符添加到您的正则表达式中

参考perldoc perlre

我也想成为苹果在命令行中输入关键字而不是实际脚本本身。

使用GetOpt::Long模块进行命令行参数处理。

参考GetOpt::Long

另外,是否可以让脚本在名为“output.txt”的指定目录中创建一个文件并将脚本的输出导入其中?我知道一个命令行,你必须有类似 > output.txt 的东西,但我不完全确定如何在脚本中实现它。

使用open(my $output_filehandle, "&gt;", "output.txt") or die "Can not open file for writing: output.txt. $!"打开要写入的文件

然后将print &lt;STUFF&gt; 替换为print $output_filehandle &lt;STUFF&gt;

参考perldoc openTutorial on opening things in Perl on Perldoc

最后,如果我能打印出该字符串在文件中出现的次数,那就太好了。例如,如果单词“apple”在文本文件中出现 5 次,我想查看文件位置的输出,以及类似“apple 在 FILE.txt 中出现 5 次”的输出

保留一个计数器变量,而不是在第一次点击后返回。然后在文件行循环结束后打印文件名和计数器。

参考:对编程和循环的基本了解,与 Perl 完全无关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-20
    • 2012-01-06
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多