在非常大的文件中快速替换文本

eis*_*son 32 sed large-files replace

我有 25GB 的文本文件,只需要在几行中替换一个字符串。我可以sed成功使用,但需要很长时间才能运行。

sed -i 's|old text|new text|g' gigantic_file.sql
Run Code Online (Sandbox Code Playgroud)

有没有更快的方法来做到这一点?

mkc*_*mkc 38

你可以试试:

sed -i '/old text/ s//new text/g' gigantic_file.sql
Run Code Online (Sandbox Code Playgroud)

从这个参考

优化速度:如果需要提高执行速度(由于输入文件大或处理器或硬盘速度慢),如果在给出“s/.../. ../“ 操作说明。

这是一个 10G 文件的比较。前:

$ time sed -i 's/original/ketan/g' wiki10gb
real    5m14.823s
user    1m42.732s
sys     1m51.123s
Run Code Online (Sandbox Code Playgroud)

后:

$ time sed -i '/ketan/ s//original/g' wiki10gb
real    4m33.141s
user    1m20.940s
sys     1m44.451s
Run Code Online (Sandbox Code Playgroud)


Sob*_*que 2

简短的回答是“否” - 此类操作的限制因素是磁盘 IO。没有任何方法可以更快地传输 25GB 的磁盘。如果您不就地编辑,并且将结果写入sed单独的驱动器(如果有可用的驱动器),您可能会得到一个小小的改进 - 因为这样您可以从一个驱动器读取,同时写入另一个驱动器,并且有一点从而减少争用。

也许可以通过不对每行使用正则表达式引擎来加快速度 - 例如使用 perl (我很确定您可以使用它,sed但我不知道语法) - 这将从10,000 行起。

perl -pe '$. > 10_000 && s/old_text/new_text/g' 
Run Code Online (Sandbox Code Playgroud)

如果 RE(元字符)中存在任何类型的复杂性,那么最小化这些复杂性将稍微提高正则表达式引擎的效率。

  • 在 sed 中,将是 `sed -i '10000,$ s/old_text/new_text/g'` (4认同)
  • 看,现在我想说的是相反的 - 你(几乎)可以在 `perl` 中编写 `sed`,但后者也可以让你编写更详细的脚本。 (2认同)