Mass Edit,但不是所有位置(grep?sed?awk?vim?)

时间:2012-07-03 20:14:36

标签: editor grep

我有一个相对较大的代码库,希望在整个代码中进行类似的更改。

我有很多像这样的行

$options = new Options();

我想用

替换它们
$options = Options::getInstance();

但在某些地方我有

$options = new Options('alternate_options_file.txt')

那些,我想独自离开。

此外,我预计将来会有更多这样的变化。

我想要一些方法在代码库中进行此更改,而无需手动触摸每个文件。在这种情况下,我可以轻松地制作一个正则表达式来捕捉我想要的。但是肯定会出现更复杂的版本。我想要一个通用的解决方案,让我:

  1. 查找要更改的一组可能位置
  2. 包含或排除部分内容
  3. 在我指定的地方自动进行更改。
  4. (我记得使用resharper,它会向你显示它将要更改的所有地方的列表,并让你包含/排除它们。但是现在我正在研究PHP,我想做一些除了纯粹的重构之外的替换。)

    现在,我最好的选择似乎是从vim内部使用ack,记录一个宏,然后使用:cnext并在适当的时候应用宏。可能有更好的选择。

2 个答案:

答案 0 :(得分:3)

http://www.ibrahim-ahmed.com/2008/01/find-and-replace-in-multiple-files-in.html

Vim可以跨文件交互式替换文本,例如:

:args **/*.php
:argdo %s/new Options()/Options::getInstance()/gec | update

我还建议您在尝试之前提交整个代码库。 注意不要搞砸你的存储库。

答案 1 :(得分:0)

sed模式将是

s/\$options = new Options();/\$options = Options::getInstance();/g

要在Linux上使用sed -i进行就地运行,或在BSD / Mac上使用sed -i.bak,然后删除备份)。要限制自己使用PHP文件,并且可能只触及带有该行的文件,请尝试:

find . -name "*.php" | xargs grep -l "\$options = new Options();" | xargs sed -i 's/\$options = new Options();/\$options = Options::getInstance();/g'

如果文件名中有空格等,请尝试find . -name "*.php" -print0 | xargs -0 sed ...

请务必先备份所有内容。如果您正在使用源代码管理(对吗?)并且在进行更改之前已经提交了所有内容,那么您应该没问题。