【问题标题】:Replacing text with mixed special characters in a file用混合特殊字符替换文件中的文本
【发布时间】:2019-08-11 22:51:03
【问题描述】:

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

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)

【问题讨论】:

标签: linux perl unix sed


【解决方案1】:

您正在传递一个包含特殊 shell 字符的字符串,例如$,通过shell解析,即被shell处理,因此丢失:

$ perl -e '$test="XXX\$YYY"; qx/set -x; echo $test/' 
+ echo XXX

反引号,qx//system("...") 容易出现此类问题,并且通常不安全。

您应该改用system() 的安全数组版本,即完全绕过shell,以便将参数按原样传递到调用的命令中:

 $ 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多