我有以下文件列表:
RF1.lib
RF2.lib
RF3.lib
etc..
在每个*.lib
文件中,我必须将此字符串vlib
替换为RF1
,RF2
等文件的名称。
我使用sed
命令搜索并替换字符串,如下所示:
sed -i -e 's/vlib/RF1/g' RF1.lib
sed -i -e 's/vlib/RF2/g' RF2.lib
但是我必须多次这样做来搜索和替换每个文件。
有没有办法可以在循环中打开文件并使用sed
命令在每个文件中进行替换?
答案 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