我正在尝试将字符串VCC_TGL替换为$ G_CORNER_SQL_DETAILS($ corner + vcc_tgl) ,但我尝试使用perl一种衬垫,但缺少$字符。
my $i="VCC_TGL";
my $test="\$G_CORNER_SQL_DETAILS(\$corner+vcc_tgl)";
print "replace $i with $test\n";
`perl -pi.back -e 's/$i/$test/' configure.tcl`;
我执行上面的perl脚本的输出是,
set vccio G_CORNER_SQL_DETAILS(corner+vcc_tgl)
您正在$通过外壳解析传递包含特殊外壳字符的字符串,例如,即它们由外壳处理,因此会丢失:
$ perl -e '$test="XXX\$YYY"; qx/set -x; echo $test/'
+ echo XXX
反跳,qx//并且system("...")容易出现此类问题,并且通常不安全。
您应该改用的安全数组版本system(),即完全绕过外壳程序,以便按原样将参数传递到调用的命令中:
$ perl -e '$i="AAA"; $test="XXX\$YYY"; system(qw(echo perl -pi.back -e), "s/$i/$test/", qw(configure.tcl));'
perl -pi.back -e s/AAA/XXX$YYY/ configure.tcl
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。