我得到一个目录,其中包含子目录和大约 300000 个不同类型的文本文件。所有这些都与某个生产项目相关,改变其架构不是一个选择。
某些任务需要在出现的任何地方替换特定字符串。每次此类替换使用 grep
和 sed
大约需要 5 分钟。使用 find
和 sed
需要更多时间......
但是,PhpStorm 在打开此目录时需要一些时间来索引所有文件,但之后使用 PhpStorm 搜索和替换所有文件的速度非常快!
是否有可能在终端模拟器中实现类似的行为?以某种方式索引给定目录中的所有文件以便快速搜索和替换?
尝试通过谷歌搜索,我发现了一些工具,例如 cscope
、idutils
、seascope
,但据我所知,存在严重的限制就像只搜索而没有明显的替换方式,或者只为函数、关键字等的源文件建立索引...
我正在寻找一种方法来索引所有文件,以便使用自动更新的索引进行快速搜索和替换。与 PhpStorm 类似,但采用终端方式且开源。
谢谢!
最佳答案
这个怎么样:
find <base directory> -type f -exec sed -i \
-e 's/<pattern1>/<replacement1>/' \
-e 's/<pattern2>/<replacement2>/' \
...
-e 's/<patternN>/<replacementN>/' \
{} ';'
关键是指定您想要同时进行的所有替换,这样您只需要遍历文件集一次。如果大多数文件都需要至少一个替换,那么我看不出你还能做得更好。
如果只有少数文件需要替换,那么您可以这样做
grep -R --files-with-matches '<pattern1>\|<pattern2>\|...<patternN>' <base directory> \
| xargs sed -i \
-e 's/<pattern1>/<replacement1>/' \
-e 's/<pattern2>/<replacement2>/' \
...
-e 's/<patternN>/<replacementN>/'
同样,关键是一次性完成文件列表中的所有替换,但此版本使用 grep 来预先测试每个文件是否需要替换。当不需要进行替换时,预测试比使用 sed 处理整个文件要快,但是当需要进行替换时,您必须通过 sed 运行文件。
任何更花哨的东西可能会花费你更多的时间来制作,而不是你最终节省下来的时间。
请注意,如果您需要明智地确定要替换的文本(例如避免替换带引号的字符串),那么 grep 和 sed 等通用工具可能不太适合您。如果您需要类似的东西,那么您确实应该使用能够理解文件格式的工具。
关于regex - 通过 bash/sed/awk 快速递归搜索和替换大量文件 - 这可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24768268/