6

我有以下脚本,它接收输入文件、输出文件并用其他字符串替换输入文件中的字符串并写出输出文件。

我想更改脚本以遍历文件目录,即不提示输入和输出文件,脚本应将目录路径作为参数,例如 C:\temp\allFilesTobeReplaced\ 并搜索字符串 x 并替换它用 y 表示该目录路径下的所有文件并写出相同的文件。

我该怎么做呢?

谢谢。

$file=$ARGV[0];

open(INFO,$file);
@lines=<INFO>;
print @lines;

open(INFO,">c:/filelist.txt");

foreach $file (@lines){
   #print "$file\n";
   print INFO "$file";
}

#print "Input file name: ";
#chomp($infilename = <STDIN>);

if ($ARGV[0]){
   $file= $ARGV[0]
}

print "Output file name: ";
chomp($outfilename = <STDIN>);
print "Search string: ";
chomp($search = <STDIN>);
print "Replacement string: ";
chomp($replace = <STDIN>);

open(INFO,$file);
@lines=<INFO>;
open(OUT,">$outfilename") || die "cannot create $outfilename: $!";

foreach $file (@lines){    
    # read a line from file IN into $_
    s/$search/$replace/g; # change the lines
    print OUT $_; # print that line to file OUT
}
close(IN);
close(OUT);
4

5 回答 5

12

perl 单行列的使用

perl -pi -e 's/original string/new string/' filename

可以结合File::Find, 给出以下单个脚本(这是我用于许多此类操作的模板)。

use File::Find;

# search for files down a directory hierarchy ('.' taken for this example)
find(\&wanted, ".");

sub wanted
{
    if (-f $_)
    {
        # for the files we are interested in call edit_file().
        edit_file($_);
    }
}

sub edit_file
{
    my ($filename) = @_;

    # you can re-create the one-liner above by localizing @ARGV as the list of
    # files the <> will process, and localizing $^I as the name of the backup file.
    local (@ARGV) = ($filename);
    local($^I) = '.bak';

    while (<>)
    {
        s/original string/new string/g;
    }
    continue
    {
        print;
    }
}
于 2009-05-27T23:09:25.753 回答
2

您可以使用 -i 参数执行此操作:

只需正常处理所有文件,但包括 -i.bak:

#!/usr/bin/perl -i.bak

while ( <> ) {
   s/before/after/;
   print;
}

这应该处理每个文件,并将原始文件重命名为 original.bak 当然,您可以将其作为@Jamie Cook 提到的单行

于 2009-05-28T16:30:05.593 回答
1

试试这个

#!/usr/bin/perl -w

@files = <*>;
foreach $file (@files) {
  print $file . '\n';
}

还看一下 Perl 中的 glob:

于 2009-05-27T21:41:01.720 回答
1

我知道您可以从命令行使用简单的 Perl 单行程序,其中文件名可以是单个文件名或文件名列表。您可能可以将此与 bgy 的答案结合起来以获得所需的效果:

perl -pi -e 's/original string/new string/' filename

而且我知道这很陈词滥调,但这听起来很像 sed,如果您可以使用 gnu 工具:

for i in `find ./allFilesTobeReplaced`; do sed -i s/original string/new string/g $i; done
于 2009-05-27T22:11:10.380 回答
-1

perl -pi -e 's#OLD#NEW#g' 文件名。您可以用适合您的文件列表的模式替换文件名。

于 2014-04-28T13:28:59.950 回答