-4

我有一个文件数组。现在我需要 cat 每个文件并搜索 file 中的关键字列表keywords.txt

我的keywords.txt包含在下面

AES
3DES
MD5
DES
SHA-1
SHA-256
SHA-512
10.*
http://
www.
@john.com
john.com

我期待输出如下

file jack.txt contains AES:5 (5 line number) http://:55
file new.txt contains 3DES:75 http://:105
4

3 回答 3

0

好的,但我在这里注意到的一件事是..

关键字

http://
oracle.com

它匹配整个单词,而不是尝试作为字符串的一部分进行匹配。只有这些关键字。。其他的应该按照上面的方法进行搜索。

于 2016-07-21T07:24:57.297 回答
0

我想可能在这些 txt 文件的一行中有多个关键字。所以下面的代码供您参考:

my @keywords;
open IN, "keywords.txt";
while(<IN>) {
    if(/^(.+)$/) {
        push(@keywords, $1); 
    }
} 
close(IN);   

my @filelist=glob("*.txt");
foreach my $filename(@filelist) {
    if(open my $fh, '<', $filename) {
        my $ln=1;
        while(my $line = <$fh>) {
            foreach my $kw(@keywords) {
                if($line=~/$kw/) {
                     print $filename.':'.$ln.':'.$kw."\n";
                }
            }
            $ln++;
        }
    }
    close($fh);
}
于 2016-07-19T14:34:41.383 回答
0

好的,这是我的代码

use warnings;
 use strict;

 open STDOUT, '>>', "my_stdout_file.txt";


 my $filename = $ARGV[2];
  chomp ($filename);
  open my $fh, q[<], shift or die $!;

   my %keyword = map { chomp; $_ => 1 } <$fh>;
   print "$fh\n";
   while ( <> ) {
    chomp;
    my @words = split;
    for ( my $i = 0; $i <= $#words; $i++ ) {
        if ( $keyword{ $words[ $i ] } ) {
                print "Keyword Found for file:$filename\n";
                printf qq[$filename Line: %4d\tWord position:         %4d\tKeyword: %s\n],
                        $., $i, $words[ $i ];
        }
}
}

但问题在于它考虑了所有参数并试图打开 ARGV[2] 的文件。实际上我只需要打开 ARGV[0] 和 ARGV[1]。ARGV[2] 我保留仅用于写入输出。欣赏回应。谢谢。

于 2016-07-19T13:44:02.353 回答