regex - 通过 bash/sed/awk 快速递归搜索和替换大量文件 - 这可能吗?

标签 regex linux bash awk sed

我得到一个目录,其中包含子目录和大约 300000 个不同类型的文本文件。所有这些都与某个生产项目相关,改变其架构不是一个选择。

某些任务需要在出现的任何地方替换特定字符串。每次此类替换使用 grepsed 大约需要 5 分钟。使用 findsed 需要更多时间......

但是,PhpStorm 在打开此目录时需要一些时间来索引所有文件,但之后使用 PhpStorm 搜索和替换所有文件的速度非常快!

是否有可能在终端模拟器中实现类似的行为?以某种方式索引给定目录中的所有文件以便快速搜索和替换?

尝试通过谷歌搜索,我发现了一些工具,例如 cscopeidutilsseascope,但据我所知,存在严重的限制就像只搜索而没有明显的替换方式,或者只为函数、关键字等的源文件建立索引...

我正在寻找一种方法来索引所有文件,以便使用自动更新的索引进行快速搜索和替换。与 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/

相关文章:

java - 正则表达式显示错误答案

bash $?变量赋值

linux - tar 文件,包括没有 sibling 的目录

linux - 设置 ENV 以使用备用 C++ 安装

c++ - "tailing"C/C++ (Linux) 中使用 inotify 的多个文件(竞争条件?)

c# - Ubuntu上的Unity/C#和Python通信

linux - bash 循环限制

javascript - 具有动态长度的正则表达式

php - 单独包装 preg_replace 重复组

javascript - 测试字符串是否包含带有整数的括号