find/replace 使用 sed 会产生意想不到的结果

find/replace with sed yields unexpected results

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

我想我会使用 sed 来完成这项任务。

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

这与示例字符串 "cybernetnews" 的预期一样有效,但是当我尝试 find/replace 针对此字符串时,事情变得很奇怪:

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" {} \;