0

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

我有一堆这样的行

$options = new Options();

我想用

$options = Options::getInstance();

但在某些地方我有

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

那些,我想一个人离开。

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

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

  1. 找到一组可能的位置来改变
  2. 包括或排除其中一些
  3. 在我指定的地方自动进行更改。

(我记得使用过 resharper,它会向您显示将要更改的所有位置的列表,并让您包含/排除它们。但现在我正在研究 PHP,我想做一些替换而不是纯粹的重构。)

现在,我最好的选择似乎是ack在 vim 内部使用,记录一个宏,然后:cnext在适当的情况下使用和应用宏。不过可能有更好的选择。

4

2 回答 2

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

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

于 2012-07-04T17:13:12.770 回答
0

sed 模式将是

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

sed -i要在 Linux 或sed -i.bakBSD/Mac 上就地应用它,请删除备份)。要将自己限制在 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 ....

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

于 2012-07-03T20:32:38.257 回答