Bash 如何处理perl pie查找替换中的特殊字符
我的文件中有以下文本:Bash 如何处理perl pie查找替换中的特殊字符,bash,perl,Bash,Perl,我的文件中有以下文本: prompt ********************************************************************************** prompt ** Start prompt ********************************************************************************** prompt ** prompt ** Calling: FILE promp
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中的任何内容替换word文件的所有实例,但是当我调用
$ 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
有人知道会发生什么吗?嵌入
文件夹中的斜杠
变量会提前终止替换
最简单的解决方案是更改分隔符。像这样的东西应该有用
$ perl -pi -e "s{FOLDER}{$folder}g" tmp.sql
文件夹
变量中嵌入的斜杠过早地终止了替换
最简单的解决方案是更改分隔符。像这样的东西应该有用
$ perl -pi -e "s{FOLDER}{$folder}g" tmp.sql
假设您有
文件夹=/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
或
很难正确地转义$文件夹中的值
,或者“猜测”安全分隔符。最安全的做法是将$folder
作为额外参数传递
perl -pi -e 'BEGIN {$replacement=shift}; s/FOLDER/$replacement/g' "$folder" ./tmp.sql
假设您有
文件夹=/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
或
很难正确地转义$文件夹中的值
,或者“猜测”安全分隔符。最安全的做法是将$folder
作为额外参数传递
perl -pi -e 'BEGIN {$replacement=shift}; s/FOLDER/$replacement/g' "$folder" ./tmp.sql
从shell环境中以Perl中的
$ENV{folder}
访问变量$folder
$ perl -pi -e 's/FOLDER/$ENV{folder}/g' ./tmp.sql
请注意,现在它使用“单引号”来分隔要执行的代码。在Perl中作为
$ENV{folder}
从shell环境访问变量$folder
$ perl -pi -e 's/FOLDER/$ENV{folder}/g' ./tmp.sql
请注意,现在它使用“单引号”来分隔要执行的代码。在
$文件夹中有什么?您没有将$folder
的值直接传递给Perl;您正在动态构建要执行的Perl表达式。如果在$folder
的值中有一个/
,它将终止s//
表达式,而不会被视为替换文本的一部分。是的,其中有一个正斜杠,我修改了文件夹的值,并修复了它。感谢您更改文件夹的值
可能并不总是可能的;请参阅我的答案,了解对Perl代码的更改,该更改对于文件夹
的任何值都是安全的?您没有将$folder
的值直接传递给Perl;您正在动态构建要执行的Perl表达式。如果在$folder
的值中有一个/
,它将终止s//
表达式,而不会被视为替换文本的一部分。是的,其中有一个正斜杠,我修改了文件夹的值,并修复了它。感谢您更改文件夹的值
可能并不总是可能的;请参阅我的答案,了解对Perl代码的更改,该更改对于文件夹的任何值都是安全的{
和}
都是路径名中的合法字符。可能是安全的,但不能保证安全{
和}
都是路径名中的合法字符。我知道这是一个不同的q,但是如果我在变量text=cat./tmp.sql
上替换了“in-place”怎么办perl-pi-e“s | FOLDER |$FOLDER | g”$text
你甚至不需要perl来实现:text=${text//FOLDER/$FOLDER}
。我知道这是一个不同的q,但是如果我在一个变量上替换了“in-place”,比如:text=cat./tmp.sql
perl-pi-e“s | FOLDER |$FOLDER | g”$text
您甚至不需要perl来实现这一点:text=${text//FOLDER/$FOLDER}
。