使用Perl搜索和替换变量值

时间:2015-10-07 07:56:43

标签: regex perl

我对如何实现搜索和替换下面显示的结果感到茫然。有些灵魂可以指导我吗?

Input.txt(包含要替换的变量的输入文件):

parameter EIW=3.4
parameter WQA=6.6 + 43.5 + 55.8
parameter IID=4.64
...
parameter KDO=2.322 * 393.3

NewVariableValues.txt(源文件中的参数值将替换为此文件中的新值):

parameter ACE=newparam1
parameter WQA=newparam2
parameter KDO=newparam3
...

Output.txt的:

parameter EIW=3.4
parameter WQA=newparam2 + 43.5 + 55.8
parameter IID=4.64
...
parameter KDO=newparam3 * 393.3

3 个答案:

答案 0 :(得分:0)

我不确定在=故意后是否吞噬了第一个值,但假设它是,这里没有太多的错误检查:

use strict;
use warnings;

my $replacements =  shift or die "missing arg";
open my $fh, '<', $replacements or die "can't open $replacements: $!";
# Slurp file and build a hash of intended replacements
my %rep = map { /^parameter ([^=]+)=(\S+)/ } <$fh>;
close $fh;
while(<STDIN>) {
    # Replace text after the = with a hash lookup if possible
    s/^parameter ([^=]+)=(\S+)/sprintf "parameter %s=%s", $1, $rep{$1}||$2/e;
    print;
}

您将替换文件作为参数传递,并在STDIN上提供原始输入。当然,通常应检查文件中的格式错误,空行等;这样的东西现在只会抛出错误或警告。

答案 1 :(得分:0)

使用/e修饰符

进行表达式替换非常简单

该程序首先打开文件NewVariableValues.txt并从中构建一个哈希%new_values,将每个新参数名称与其值相关联。然后读取文件Input.txt,并将所有value构造中的NAME=value替换为散列中的相应值

use strict;
use warnings;
use v5.14.1;
use autodie;

my %new_values;
{
    open my $fh, '<', 'NewVariableValues.txt';
    while ( <$fh> ) {
        $new_values{$1} = $2 if /([^\s=]+)=(.+)/;
    }
}

{
    open my $fh, '<', 'Input.txt';
    while ( <$fh> ) {
        s<([^\s=]+)=\K(\S+)><$new_values{$1} // $2>e;
        print;
    }
}

输出

parameter EIW=3.4
parameter WQA=newparam2 + 43.5 + 55.8
parameter IID=4.64
...
parameter KDO=newparam3 * 393.3

答案 2 :(得分:-1)

行示例:parameter WQA=6.6 + 43.5 + 55.8

您可以尝试以下方式: line =~ s/(parameter WQA= ?)([0-9.]+)/\1$newparam1/

(假设您知道如何从文件中获取newparam1)