用文件中的混合特殊字符替换文本

时间:2019-03-21 05:44:14

标签: linux perl unix sed

我正在尝试将字符串 VCC_TGL 替换为 $ G_CORNER_SQL_DETAILS($ corner + vcc_tgl) 我尝试使用perl one衬纸,但缺少 $ 字符。

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)

1 个答案:

答案 0 :(得分:0)

您正在传递包含特殊shell字符的字符串,例如$,通过外壳解析,即它们由外壳处理,因此迷路了:

$ 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