我有一个相对较大的代码库,希望在整个代码中进行类似的更改。
我有很多像这样的行
$options = new Options();
我想用
替换它们$options = Options::getInstance();
但在某些地方我有
$options = new Options('alternate_options_file.txt')
那些,我想独自离开。
此外,我预计将来会有更多这样的变化。
我想要一些方法在代码库中进行此更改,而无需手动触摸每个文件。在这种情况下,我可以轻松地制作一个正则表达式来捕捉我想要的。但是肯定会出现更复杂的版本。我想要一个通用的解决方案,让我:
(我记得使用resharper,它会向你显示它将要更改的所有地方的列表,并让你包含/排除它们。但是现在我正在研究PHP,我想做一些除了纯粹的重构之外的替换。)
现在,我最好的选择似乎是从vim内部使用ack
,记录一个宏,然后使用:cnext
并在适当的时候应用宏。可能有更好的选择。
答案 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 ...
。
请务必先备份所有内容。如果您正在使用源代码管理(对吗?)并且在进行更改之前已经提交了所有内容,那么您应该没问题。