【问题标题】:find/replace with sed yields unexpected results用 sed 查找/替换会产生意想不到的结果
【发布时间】:2015-02-12 23:11:05
【问题描述】:

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

我想我会使用 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 挂断了哪些角色,我该如何正确逃脱?

【问题讨论】:

标签: bash replace sed


【解决方案1】:

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

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

【讨论】:

  • 补充一点,$ 也是一个特殊字符。它在 sn-p 中正确转义,只是没有被提及。
猜你喜欢
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 2019-04-05
  • 1970-01-01
  • 2022-01-17
  • 2017-03-19
  • 2021-10-04
  • 1970-01-01
相关资源
最近更新 更多