如何处理perl pie中的特殊字符查找替换

时间:2016-07-27 15:56:52

标签: bash perl

我在文件中有以下文字:

prompt **********************************************************************************
prompt **  Start
prompt **********************************************************************************
prompt **
prompt **  Calling:  FILE
prompt **
prompt **
@@FOLDER\FILE
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;

哪个只有文件夹字符串,它咳嗽起来,不会替换任何东西,我调用它的shell会吐出这些东西:

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

任何人都知道是什么给出了什么?

3 个答案:

答案 0 :(得分:3)

message.AppendLine("<img src='www.somesitename.com/storage/logo.ong' />"); 变量中嵌入的斜杠过早地终止了替换

最简单的解决方案是更改分隔符。这样的事情应该有效

folder

答案 1 :(得分:3)

假设您有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中的值或者#34;猜测&#34;一个安全的分隔符。最安全的做法是将$folder作为额外参数传递。

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

答案 2 :(得分:2)

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

$ENV{folder}

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