【问题标题】:Shell command on each line of file每行文件的shell命令
【发布时间】:2013-03-27 13:23:45
【问题描述】:

我正在尝试编写一个 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

【问题讨论】:

  • 为什么要使用 perl 来做真正应该是 shell 脚本的事情?
  • 如前所述,这更像是一个 shell 脚本问题,但使用 Perl 自己的文件读取和搜索功能而不是调用 egrep 可能会更好。

标签: perl shell scripting


【解决方案1】:

在 shell (bash) 中创建一个目录结果并在文件“列表”中的一行中列出你的文件,然后在 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 $_;
        }
    }
}

【讨论】:

    【解决方案2】:

    像这样遍历文件名:

    while read file
    do
       egrep "module|imput|ouput" "$file" > "/another/directory/${file##*/}" 
    done < fileList.txt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多