0

我正在尝试编写一个 Perl 脚本,它将执行以下操作:
1. 打开一个文件,该文件在每一行中都包含多个文件的位置(例如文件 A,文件 B)
2. 对每个文件执行 egrep 操作像 egrep "module|input|output"
3. 将 egrep 的输出以相同的文件名 A、B 等存储在不同的目录中)

egrep 有更多的限制,但我可以稍后添加。

我的问题是如何执行第 2 步和第 3 步?在哪里,我在我的 Perl 脚本打开的文件的每一行上执行一个 shell 命令。例如,文件位置是,design/rtl/name.v我希望将 egrep 的结果存储在design/fake/name.v

4

2 回答 2

2

在shell(bash)中创建一个目录结果并在文件“list”中的一行中列出您的文件,然后在bash提示符下直接输入

for i in `cat list`;do egrep "string" $i > result/grep${i}; done

这在 perl 中是类似的。错误行为更好,它可能会更快一点:真正的优势是可以更容易地添加额外的行为。将其保存为文件并作为“perl script list foo”运行,其中 script 是脚本的文件名,list 是文件列表的文件名,foo 是正在搜索的模式

#!/usr/bin/perl
#

my ( $file, $pattern ) = @ARGV;

open( my $fh, $file ) || "die $! $file\n";

while (<$fh>) {
    chomp;    #trim newline from filename
    my $togrep = $_;
    open( my $grepfh, $togrep ) || warn "$togrep $!";
    if ($grepfh) {
        open( my $output, ">result/$togrep" ) || die "$togrep $!";
        while ( grep( $pattern, <$grepfh> ) ) {
            print $output $_;
        }
    }
}
于 2013-04-05T08:11:00.080 回答
1

像这样循环文件名:

while read file
do
   egrep "module|imput|ouput" "$file" > "/another/directory/${file##*/}" 
done < fileList.txt
于 2013-04-05T08:10:45.283 回答