簡體   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