使用sed in循环搜索和替换多个文件

时间:2015-10-24 17:25:26

标签: perl sed

我有以下文件列表:

RF1.lib
RF2.lib
RF3.lib 
etc..

在每个*.lib文件中,我必须将此字符串vlib替换为RF1RF2等文件的名称。

我使用sed命令搜索并替换字符串,如下所示:

sed -i -e 's/vlib/RF1/g' RF1.lib

sed -i -e 's/vlib/RF2/g' RF2.lib

但是我必须多次这样做来搜索和替换每个文件。

有没有办法可以在循环中打开文件并使用sed命令在每个文件中进行替换?

3 个答案:

答案 0 :(得分:0)

不确定。你可以说:

for f1 in RF*.lib: do
    j=`basemame $f1 .lib`
    sed -i -e "s/vlib/$j/g" $f1
 done

答案 1 :(得分:0)

这是一个Perl脚本,它将用filename:

替换每个文件中的字符串
#!/usr/bin/perl
use warnings;
use strict;

foreach my $file (glob "/path/to/dir/*.lib") #get all the '.lib' files from dir
{
    my ($filename) = $file =~ m/([^\/]+)\.lib$/; #get the filename
    open my $fh, "<", $file or die $!;
    my @data = <$fh>;
    close $fh;
    foreach my $line (@data)
    {   
        $line =~ s/\bvlib\b/$filename/g; #replace string with filename
    }
    #modify the file
    open my $fhw, ">", $file or die "Couldn't modify file: $!";
    print $fhw @data;
    close $fhw;
}

编辑:在评论中建议 Borodin ,将整个文件读入标量:

foreach my $file (glob "/path/to/dir/*.lib")  #get all the '.lib' files from dir
{
    my ($filename) = $file =~ m/([^\/]+)\.lib$/;  #get the filename

    #read whole file in a scalar
    my $data = do {
        local $/ = undef;
        open my $fh, "<", $file or die $!;
        <$fh>;
    };
    $data =~ s/\bvlib\b/$filename/g;  #replace string with filename

    #modify the file
    open my $fhw, ">", $file or die "Couldn't modify file: $!";
    print $fhw $data;
    close $fhw;
}

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed -r 's|(.*)\.*|sed -i "s/vlib/\1/g" &|e' fileOfFiles

这将评估包含文件的文件中每个文件的sed命令。如果您更喜欢命令的输出可以通过管道传输到shell中以获得相同的效果,如下所示:

sed -r 's|(.*)\.*|sed -i "s/vlib/\1/g" &|' fileOfFiles | sh