Previous post related:如何将替换正则表达式作为命令行参数传递给Perl
在阅读了上面的内容之后,我写了一个非常相似的脚本,但是当我使用$1
之类的反向引用时,我无法按照我的意图进行插值。可能是因为我没有使用正确的单/双引号或其中某些组合,但我已经绞尽脑汁待了几个小时。
当我这样调用程序时,它可以正常工作
perl edit.pl "(BUILD_NUMBER)=.*" "BUILD_NUMBER=1.2.3.4" env.properties
1: <-- BUILD_NUMBER=0.0
1: --> BUILD_NUMBER=1.2.3.4
当调用程序包括反向引用时,它会失败:
perl edit.pl "(BUILD_NUMBER)=.*" "$1=1.2.3.4" env.properties
1: <-- BUILD_NUMBER=0.0
1: --> =1.2.3.4
代码:
#!/usr/bin/perl
use warnings;
use strict;
my ($searchString, $replaceString, $fileName) = @ARGV;
my $occurences = 0;
my @newlines=();
my $line="";
open (READ, "$fileName") || die "File not found";
while ( <READ> ){
if ($_ =~ $searchString){
print "$.: <-- $_";
$_ =~ s/$searchString/$replaceString/;
print "$.: --> $_","\n";
$occurences++;
}
push(@newlines,$_);
}
print "Lines: $., Changes: $occurences";
close(READ);
open(WRITE, ">$fileName") || die "File not found";
print WRITE @newlines;
close(WRITE);
答案 0 :(得分:0)
这是一种非常讨厌的做事方式(你实际上将Perl代码视为数据),但你可以通过改变来实现它的工作
$_ =~ s/$searchString/$replaceString/;
到
s/$searchString/$replaceString/ee;
或
eval "s/$searchString/$replaceString/";
通常的警告适用于对外部来源数据使用eval
。
更好的方法是完全避免反向引用,并使用命令行
perl edit.pl 'BUILD_NUMBER=\K.*' '1.2.3.4' env.properties
或者,如果您使用的是非常旧版本的Perl
perl edit.pl '(?<=BUILD_NUMBER=).*' '1.2.3.4' env.properties