使用find+perl批量替换PHP文件中$c[color7]为$c['color7']失败求助
解决Perl批量替换中单引号失效的问题
问题描述
需要将目标文件中的代码片段:
$i%2==0 ? $color="$c[color7]" : $color="$c[color7]";
替换为:
$i%2==0 ? $color="$c['color7']" : $color="$c['color7']";
执行以下命令时替换失效:
find . -name "test3.php" -exec perl -pi -e 's/\$c\[color7\]/\$c\['color7'\]/g' {} \;
仅当替换目标改为HTML实体"color7"时命令才生效,但这不是预期结果。
问题原因
你的命令中,Perl的-e参数是用单引号包裹的,而替换字符串里的单引号'会被Shell解析为单引号字符串的闭合标记,导致Perl实际收到的命令语法错误,无法正确执行替换。
解决办法
提供三种可行的修正方案:
方案1:在Shell中转义单引号
在Shell的单引号包裹的字符串中,要插入单引号,需要用'\''的组合(先闭合当前单引号,输出一个单引号,再重新开启单引号):
find . -name "test3.php" -exec perl -pi -e 's/\$c\[color7\]/\$c\['\''color7'\''\]/g' {} \;
方案2:用双引号包裹Perl命令
将-e参数改用双引号包裹,同时转义需要保留的$(避免Shell解析为环境变量):
find . -name "test3.php" -exec perl -pi -e "s/\$c\[color7\]/\$c\['color7'\]/g" {} \;
方案3:用Perl的字符串转义
在Perl的替换字符串中,用\x27表示单引号(ASCII码的单引号),这样无需处理Shell的单引号冲突:
find . -name "test3.php" -exec perl -pi -e 's/\$c\[color7\]/\$c\[\x27color7\x27\]/g' {} \;
验证
执行任意一种修正后的命令后,查看test3.php文件,应该能看到$c[color7]已被替换为$c['color7']。
内容的提问来源于stack exchange,提问作者iyagi
相关产品推荐
相关产品推荐

