Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何将带有反向引用的替换正则表达式作为命令行参数传递给Perl脚本_Regex_Perl_Argument Passing_Backreference - Fatal编程技术网

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

Regex 如何将带有反向引用的替换正则表达式作为命令行参数传递给Perl脚本,regex,perl,argument-passing,backreference,Regex,Perl,Argument Passing,Backreference,如何将替换正则表达式作为命令行参数传递给Perl 在阅读了上面的内容后,我编写了一个非常类似的脚本,但当我使用反向引用(如$1)时,我无法让它按照我的意愿进行插值。这可能是因为我没有使用正确的单引号/双引号或它们的组合,但我已经绞尽脑汁几个小时了 当我这样调用程序时,它工作得很好 perl edit.pl "(BUILD_NUMBER)=.*" "BUILD_NUMBER=1.2.3.4" env.properties 1: <-- BUILD_NUMBER=0.0 1: --> B

如何将替换正则表达式作为命令行参数传递给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“(内部版本号)=.*“内部版本号=1.2.3.4”环境属性
1:构建单元编号=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
perl edit.pl”(内部版本号)=.*“$1=1.2.3.4”环境属性
1:  =1.2.3.4
代码:

#/usr/bin/perl
使用警告;
严格使用;
我的($searchString,$replaceString,$fileName)=@ARGV;
我的$occurrences=0;
我的@newlines=();
我的$line=“”;
打开(读取“$fileName”)| | die“未找到文件”;
而(){
if($\ux=~$searchString){
打印“$:$\”,“\n”;
$occurrences++;
}
推送(@换行符,$\ux);
}
打印“行:$,更改:$occurrences”;
关闭(读取);
打开(写入“>$fileName”)| |模具“未找到文件”;
打印-写入@换行符;
关闭(写入);

这是一种非常令人讨厌的方法(本质上是将Perl代码视为数据),但您可以通过更改

$_ =~ s/$searchString/$replaceString/;
要么

s/$searchString/$replaceString/ee;

通常的注意事项适用于对外部数据使用
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

perl edit.pl'(?请不要在文章中使用HTML。请使用标记,使用代码的代码格式,而不是blockquote。问题是
$1
是(可能是)由shell插值并替换为空字符串。您可以尝试改用单引号。也可以不使用单引号,而是在第一个参数中使用lookbehind断言:
“(?在命令行中将
perl
替换为
echo
,这样您就可以看到真正传递给程序的内容。顺便说一句,您知道您的整个脚本可以替换为一行代码?
perl-pi-e的/^BUILD\u NUMBER=\K.*/1.2.3.4/'env.properties
——尽管您不会得到更改内容的确认,除非您添加该部分。您应该知道,使用
-i
开关会导致文件发生不可逆的更改。但您已经在做一些等效的操作,所以我想您知道。我尝试了单引号,结果是“$1=1.2.3.4”。我尝试用“\”多引号取消引用$“我仍然没有找到合适的组合来达到我想要的结果。
perl edit.pl 'BUILD_NUMBER=\K.*' '1.2.3.4' env.properties
perl edit.pl '(?<=BUILD_NUMBER=).*' '1.2.3.4' env.properties