Bash 查找/替换为sed会产生意外的结果

Bash 查找/替换为sed会产生意外的结果,bash,replace,sed,Bash,Replace,Sed,我正在尝试查找/替换在分布在目录树中的许多文件中找到的字符串 我想我应该用sed来完成这个任务 find /some/dir -name \*.php -exec sed -i "s/cybernetnews/cybernet/g" {} \; 这与示例字符串cybernetnews的预期效果一样,但当我尝试查找/替换此字符串时,情况变得很奇怪: preg_match($_SESSION['infos']['num'], $numeric_variable) 我想用常量infos_num替换

我正在尝试查找/替换在分布在目录树中的许多文件中找到的字符串

我想我应该用sed来完成这个任务

find /some/dir -name \*.php -exec sed -i "s/cybernetnews/cybernet/g" {} \;
这与示例字符串cybernetnews的预期效果一样,但当我尝试查找/替换此字符串时,情况变得很奇怪:

preg_match($_SESSION['infos']['num'], $numeric_variable)
我想用常量infos_num替换字符串$_SESSION['infos']['num']

所以我认为这会起作用:

find /some/dir -name \*.php -exec sed -i "s/$_SESSION['infos']['num']/INFOS_NUM/g" {} \;
不走运,以下是运行上述命令后测试php文件中显示的内容:

preg_match($_SESSION['INFOS_NUMfoINFOS_NUM][INFOS_NUMum'], 
           $INFOS_NUMmeric_variable)
我试图避开单一的引用,但得到了完全相同的结果。如果我退出括号,则不会进行任何更改

sed挂起的字符是什么?如何正确转义?

$,[,]是正则表达式中的特殊字符,您必须在正则表达式中转义,以便从字面上匹配这些字符。要进行不区分大小写的匹配,需要在最后添加i修饰符

find /some/dir -name \*.php -exec sed -i "s/\$_SESSION\['infos'\]\['num'\]/INFOS_NUM/g" {} \;

加上$也是一个特殊的字符。它在代码段中转义正确,只是没有提到。可能的重复请解释否决票。