Editor 批量编辑,但不是所有位置(grep?sed?awk?vim?)

Editor 批量编辑,但不是所有位置(grep?sed?awk?vim?),editor,grep,Editor,Grep,我有一个相对较大的代码库,希望在整个代码中进行类似的更改 我有一大堆这样的台词 $options = new Options(); 我想把它们换成 $options = Options::getInstance(); 但在一些地方我有 $options = new Options('alternate_options_file.txt') 那些,我想离开 此外,我预计未来会有更多类似的变化 我希望有一种方法可以在整个代码库中进行更改,而不必手动触摸每个文件。在这种情况下,我可以轻松地创建一

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

我有一大堆这样的台词

$options = new Options();
我想把它们换成

$options = Options::getInstance();
但在一些地方我有

$options = new Options('alternate_options_file.txt')
那些,我想离开

此外,我预计未来会有更多类似的变化

我希望有一种方法可以在整个代码库中进行更改,而不必手动触摸每个文件。在这种情况下,我可以轻松地创建一个正则表达式,只捕获我想要的正则表达式。但接下来肯定会有更复杂的版本。我想要一个通用的解决方案,使我能够:

  • 找到一组可能要更改的位置
  • 包括或排除其中一些
  • 在我指定的位置自动进行更改
  • (我记得使用resharper,它会向您显示它将要更改的所有位置的列表,并允许您包括/排除它们。但现在我正在使用PHP,我想进行一些替换,而不是纯粹的重构。)


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

    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-名称“*.php”-print0 | xargs-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-名称“*.php”-print0 | xargs-0 sed…

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

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

    :args **/*.php
    :argdo %s/new Options()/Options::getInstance()/gec | update
    
    我还建议您在尝试此操作之前提交整个代码库。 小心不要把你的存储库搞砸。

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

    :args **/*.php
    :argdo %s/new Options()/Options::getInstance()/gec | update
    
    我还建议您在尝试此操作之前提交整个代码库。
    当心不要把你的存储库搞砸。

    Hmm。。。但这需要你设计一个正则表达式,它包含或排除你想要的目标。我想要一个能让你互动选择的答案。嗯。。。但这需要你设计一个正则表达式,它包含或排除你想要的目标。我想要一个能让你互动选择的答案。我不知道args/argdo。这看起来正是我所需要的。为了加快速度,我现在正在运行
    ack-l'new\s*Options()'| xargs mvim
    ,这为我提供了一个新窗口,其中args设置为仅包含目标字符串的文件。我不知道args/argdo。这看起来正是我需要的。为了加快速度,我现在正在运行
    ack-l'new\s*Options()'| xargs mvim
    ,这为我提供了一个新窗口,其中args设置为仅包含目标字符串的文件。