Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何处理perl pie查找替换中的特殊字符_Bash_Perl - Fatal编程技术网

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}