[英]How to pass a replacing regex as a command line argument to a perl script
[英]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.