【问题标题】:Replacing a string containing special characters with sed用 sed 替换包含特殊字符的字符串
【发布时间】:2011-09-16 11:29:58
【问题描述】:

我在这里和其他地方浏览过很多关于这个主题的帖子,但提供的解决方案似乎都不适合我。我需要在特定文件夹中的所有文件中用另一个字符串(包含正确的 PHP 代码)替换一个字符串(其中包含错误的无意义 PHP 代码)。我知道在使用 sed 时唯一需要转义的字符是与号、反斜杠以及用作分隔符的任何字符。

我要搜索的字符串是:

$arguments = func_get_args();$numargs = func_num_args();for($i=1; $i < $numargs; $i++){$arguments[$i] = $arguments = func_get_args();$arguments[$i];}

我要替换的字符串是:

$arguments = func_get_args();$numargs = func_num_args();for($i=1; $i < $numargs; $i++){$arguments[$i] = &$arguments[$i];}

我尝试了许多变体,但无法让它发挥作用。我认为以下命令应该工作(但没有)。

find /folder/to/search -name Function.php -type f -exec sed -i 's|$arguments = func_get_args();$numargs = func_num_args();for($i=1; $i < $numargs; $i++){$arguments[$i] = $arguments = func_get_args();$arguments[$i];}|$arguments = func_get_args();$numargs = func_num_args();for($i=1; $i < $numargs; $i++){$arguments[$i] = \&$arguments[$i];}|' {} \;

这让我发疯 - 任何帮助将不胜感激!

【问题讨论】:

  • 只替换 for 循环中的内容是否就足够了(这似乎是两者之间的唯一区别)?
  • 是的,我可能应该简化一下。在进行搜索和替换时,我通常会尝试包含整行以避免误报,但在这种情况下,内部部分足够具体就足够了。

标签: regex sed escaping replace


【解决方案1】:

我终于找到了正确的语法。与我读过的所有建议相反,我需要在两个表达式中转义美元符号并打开方括号(但不是右方括号或弯括号)。所以这是对我来说终于可以正常工作的命令:

find /folder/to/search -name Function.php -type f -exec sed -i 's/\$arguments\[\$i] = \$arguments = func_get_args();\$arguments\[\$i];/\$arguments\[\$i] = \&\$arguments\[\$i];/' {} \;

再次感谢回复的人。

【讨论】:

  • 您可以接受自己的答案并投票。这将增加你的声望点。祝你好运。
【解决方案2】:

我知道在使用 sed 时唯一需要转义的字符是与号、反斜杠以及用作分隔符的任何字符

搜索表达式不正确。它是一个正则表达式;对于文字匹配,您需要转义所有正则表达式特价,即至少 s%\([][^$.\*]\)%\\\1%g (即兴 - 我可能错过了一些,和/或您的 sed 可能与我的不同)。幸运的是,这很容易以编程方式完成,例如使用 sed - 请小心,以免混淆。

替换字符串是一个文字字符串,除了反向引用,所以对于那部分你的陈述是正确的。

#!/bin/sh
from=`sed 's%[][^$.\*]%\\\&%'<<'____HERE'
$arguments = func_get_args();$numargs = func_num_args();for($i=1; $i < $numargs; $i++){$arguments[$i] = $arguments = func_get_args();$arguments[$i];}
____HERE`
to=`cat<<'____THERE'
$arguments = func_get_args();$numargs = func_num_args();for($i=1; $i < $numargs; $i++){$arguments[$i] = \&$arguments[$i];}
____THERE`
find /folder/to/search -name Function.php -type f -exec sed -i "s|$from|$to|" {} \;

【讨论】:

  • 谢谢 - 我应该意识到第一部分是一个正则表达式,所以需要转义。但是,我尝试了您的脚本,但由于“第 8 行:to:找不到命令”和 4x“表达式 #1,字符 158:无效的反向引用”而失败。我也试过这个,它没有执行替换: find /folder/to/search -name Function.php -type f -exec sed -i 's|\$arguments[\$i] = \$arguments = func_get_args\ (\);\$arguments[\$i];|$arguments[$i] = \&$arguments[$i];|' {} \;
  • 它应该是to=`cat ...= 周围没有空格。祝你好运!
  • 谢谢,修复了第一个错误,但我仍然得到 char 158: Invalid back reference,并且没有执行替换。
  • 抱歉,发帖前应该进行更彻底的测试。我已经编辑了代码,但可能仍需要调整;我在 OSX 上进行了测试,其中sed 的工作方式与例如略有不同。 Linux。
猜你喜欢
  • 2014-03-30
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
相关资源
最近更新 更多