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" {} \;
我正在尝试 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" {} \;