如何在perl-pie-for-replace中处理特殊字符



我在一个文件中有以下文本:

prompt **********************************************************************************
prompt **  Start
prompt **********************************************************************************
prompt **
prompt **  Calling:  FILE
prompt **
prompt **
@@FOLDERFILE
prompt **
prompt **  commit
commit;
prompt **
prompt **
prompt **
prompt **********************************************************************************
prompt **  End
prompt **********************************************************************************

当我做时

$ perl -pi -e "s/FILE/$file/g" ./tmp.sql;

它将单词FILE的所有实例替换为$FILE中的任何实例,但当我调用时

$ perl -pi -e "s/FOLDER/$folder/g" ./tmp.sql;

它只有文件夹字符串,它会咳嗽出来,不会替换任何东西,而我调用它的外壳会吐出这样的东西:

Execution of -e aborted due to compilation errors.
Unquoted string "g" may clash with future reserved word at -e line 1.
Unknown regexp modifier "/R" at -e line 1, at end of line
Unknown regexp modifier "/F" at -e line 1, at end of line
Unknown regexp modifier "/5" at -e line 1, at end of line
Unknown regexp modifier "/4" at -e line 1, at end of line
Unknown regexp modifier "/7" at -e line 1, at end of line
Unknown regexp modifier "/5" at -e line 1, at end of line
Unknown regexp modifier "/6" at -e line 1, at end of line
Unknown regexp modifier "/_" at -e line 1, at end of line
Unknown regexp modifier "/2" at -e line 1, at end of line

有人知道付出了什么吗?

假设您有folder=/some/path。以下是shell处理完以下行之后对Perl的调用:

perl -pi -e "s/FOLDER//some/path/g" ./tmp.sql

shell变量的值不会传递到Perl中;shell在Perl看到字符串之前对其执行简单的文本扩展

如果你真的在做替换,你会意识到你需要键入类似的东西

perl -pi -e "s/FOLDER//some/path/g" ./tmp.sql

perl -pi -e "s|FOLDER|/some/path|g" ./tmp.sql

很难正确转义$folder中的值,也很难"猜测"一个安全的分隔符。最安全的做法是将$folder作为一个额外的参数传递。

perl -pi -e 'BEGIN {$replacement=shift}; s/FOLDER/$replacement/g' "$folder" ./tmp.sql

嵌入folder变量中的斜线过早终止替换

最简单的解决方案是更改分隔符。像这样的东西应该工作

$ perl -pi -e "s{FOLDER}{$folder}g" tmp.sql

在Perl中以$ENV{folder}的形式从shell环境中访问变量$folder

$ perl -pi -e 's/FOLDER/$ENV{folder}/g' ./tmp.sql

请注意,这现在使用"单引号"来分隔要执行的代码。

最新更新