使用sed查找/替换会产生意外结果

时间:2015-02-12 00:33:30

标签: bash replace sed

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

我以为我会用sed来完成这个任务。

find /some/dir -name \*.php -exec sed -i "s/cybernetnews/cybernet/g" {} \;

这与预期的示例字符串“cybernetnews”一样,但是当我尝试查找/替换此字符串时,事情变得奇怪:

preg_match($_SESSION['infos']['num'], $numeric_variable)

我想用常量$_SESSION['infos']['num']替换字符串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被挂起的角色是什么,我该如何正确逃脱它?

1 个答案:

答案 0 :(得分:2)

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

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