【问题标题】:Fast recursive search and replace through huge amount of files via bash/sed/awk - is it possible?通过 bash/sed/awk 快速递归搜索和替换大量文件 - 可能吗?
【发布时间】:2014-07-15 21:13:37
【问题描述】:

我得到了一个包含子目录和大约 300000 个不同类型的文本文件的目录。所有这些都与某个生产项目相关,因此无法更改其架构。

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

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

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

尝试谷歌搜索,我发现了一些工具,如cscopeidutilsseascope,但据我所知,存在严重的限制,例如仅搜索而没有明显的替换方法,或仅索引源文件对于函数、关键字等...

我正在寻找一种方法来索引所有文件以快速搜索并替换为自动更新的索引。与 PhpStorm 类似,但终端方式和开源。

谢谢!

【问题讨论】:

  • 如果您可以并行调用 sed -i ... 操作 (10-50) 会如何,这将同时处理不同的文件集。您可能会更快地更换字符串。即在find /main/location -maxdepth 0做目录;回显我的目录是 $dir; some_file_replace.sh $dir &;睡眠 500; done .. now ... 您可以将以下代码放入 some_file_replace.sh 作为 .... for files in `find $1 -type f;回显这是 $1 中的文件 $file; sed -i "s/xxx/yyy/g' $file; 完成
  • 我想我明白你所说的,但我怀疑它会提高性能,因此整个负担在 IO 上,而不是在 CPU 上。至少在我的情况下。因此,如果我有 SSD 肯定会有所改进,但我没有,无论如何我想要一些开源索引解决方案。

标签: regex linux bash awk sed


【解决方案1】:

这个怎么样:

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 等通用工具可能不适用于您。如果您需要类似的东西,那么您真的应该使用了解文件格式的工具。

【讨论】:

  • 我知道如何使用 find、grep 和 sed。我无法预见我应该替换的所有字符串。正如我在问题中描述的那样,我正在寻找某种索引解决方案。 PhpStorm 的一些开源替代品,最好是命令行工具。
  • 您的问题表明您正在寻找使用标准命令行工具。据我所知,全文索引不是任何标准工具提供的功能。您通常只能在数据库中找到它。如果您坚持使用基于索引的解决方案,那么您将不得不构建它。
  • John Bollinger 因此在“Linux 作为 IDE 与 PhpStorm”中,Linux 缺乏非常有用的特性。有点令人失望。
猜你喜欢
  • 2016-08-26
  • 1970-01-01
  • 2017-08-25
  • 2017-08-02
  • 2014-09-08
  • 2020-02-03
  • 2010-09-19
  • 2011-08-16
  • 1970-01-01
相关资源
最近更新 更多