繁体   English   中英

如何将带有后向引用的替换正则表达式作为命令行参数传递给Perl脚本

[英]How to pass a replacing regex with a backreference as a command line argument to a Perl script

一篇相关文章:如何将替换的正则表达式作为命令行参数传递给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);

这是做事的一种非常讨厌的方式(本质上是将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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM