Perl注意一个文件中的变量,在另一个文件中搜索并替换它

时间:2013-10-04 12:21:32

标签: perl file search replace

这是我的第一个问题。我想通过使用Perl来实现以下目标 代码应搜索File2中File1中提到的参数,并将文件2中“:”后面的值替换为File1中的值。代码应该就地替换,不要更改/排序文件中的参数顺序。

文件1:

config1: abc
config2: bcd
config3: efg

文件2:

config1: cba
config2: sdf
config3: eer
config4: 343
config5: sds
config6: dfd

输出 - > File2应如下所示:

config1: abc
config2: bcd
config3: efg
config4: 343
config5: sds
config6: dfd

2 个答案:

答案 0 :(得分:1)

  • 使用File::Slurp读取文件1
    • 对于每一行,使用split或正则表达式将键与值分开,并将此键值对附加到%file哈希值。
  • 要真正替换就地,请在Perl的命令行中使用-pi参数; (你可以尝试使用Tie::Hash,但可能会更难)。
  • 您可以通过使用File::Slurp将file2读入哈希%file2,使用%file1的循环覆盖%hash2值覆盖%hash2值,来模仿此问题。在正确的循环中构造key-valye字符串后,再次使用%hash2将结果File::Slurp写回file2。

如果您在执行特定步骤时遇到困难,请显示您已完成的操作以及问题所在,以便我们帮助您排查问题

答案 1 :(得分:-1)

use strict;
use warnings;

#store params from file1
my (%params);

open(my $FILE1, "< file1.txt") or die $!;
my @arr = <$FILE1>;
foreach(@arr){ 
   #extract key-value pairs \s* = any number of spaces, .* = anything
   #\w+ = any sequence of letters (at least one)
   my ($key, $value) = ($_ =~ /(\w+)\s*:\s*(.*)/);
   $params{$key}=$value; 
}
close $FILE1;

open(my $FILE2, "< file2.txt") or die $!;
my @arr2 = <$FILE2>;
foreach(@arr2){
   my ($key, $value) = ($_ =~ /(\w+)\s*:\s*(.*)/);
   #if the found key did exist in params, then replace the found value, with 
   #the value from file 1 (this may be dangerous if value contains regexp chars, 
   #consider using e.g. \Q...\E
   if (exists $params{$key}) {
       #replace the row in @arr2 inline using direct ref $_
       $_ =~ s/$value/$params{$key}/;
   }
}
close $FILE2
#replace / output the result /here to a different file, not to destroy
open(my $FILE2W, "> file2_adjusted.txt") or die $!;
print $FILE2W @arr2;
close $FILE2W