使用VIM中的大文件

时间:2009-10-19 23:37:11

标签: vim large-files

我尝试在VIM中打开一个巨大的(~2GB)文件,但是它很窒息。我实际上并不需要编辑文件,只是有效地跳转。

如何在VIM中处理非常大的文件?

10 个答案:

答案 0 :(得分:84)

我今天要编辑12GB文件。 vim LargeFile插件对我不起作用。它仍然耗尽了我所有的记忆,然后打印了一条错误信息:-(。我也不能使用hexedit,因为它不能插入任何东西,只是覆盖。这是另一种方法:

您拆分文件,编辑部件然后重新组合。你仍然需要两倍的磁盘空间。

  • 为您要编辑的行周围的某些内容提供Grep:

    grep -n 'something' HUGEFILE | head -n 1
    
  • 提取文件的范围。假设您要编辑的行位于第4行和第5行。然后执行:

    sed -n -e '4,5p' -e '5q' HUGEFILE > SMALLPART
    
    • 需要-n选项来禁止sed打印所有内容的默认行为
    • 4,5p打印第4行和第5行
    • 5q在处理第5行后取消了sed
  • 使用您喜欢的编辑器编辑SMALLPART

  • 合并文件:

    (head -n 3 HUGEFILE; cat SMALLPART; sed -e '1,5d' HUGEFILE) > HUGEFILE.new 
    
    • ie:从HUGEFILE(在这种情况下是前三行)中选择编辑行之前的所有行,将其与编辑的行(在本例中为第4行和第5行)组合并使用此组合行替换HUGEFILE中的等价物(在这种情况下是前5行)并将其全部写入新文件。

    HUGEFILE.new现在将成为您已修改的文件,您可以删除原始HUGEFILE

答案 1 :(得分:30)

多年来,这一直是一个反复出现的问题。 (数字不断变化,但概念是一样的:如何查看或编辑大于内存的文件?)

显然moreless是仅仅阅读文件的好方法--- less甚至提供vi类似于滚动和搜索的键绑定。

对“大文件”的Freshmeat搜索表明,两位编辑将特别适合您的需求。

一个是:lfhex ...一个大文件十六进制编辑器(取决于Qt)。显然,那个需要使用GUI。

另一个似乎适合使用控制台:hed ...它声称有一个类似vim的界面(包括ex模式?)。

我确信我已经看到其他Linux / UNIX编辑器能够翻阅文件而无需将其全部内容加载到内存中。但是,我不记得他们的任何名字。我正在将此回复作为“wiki”条目,以鼓励其他人将其链接添加到此类编辑器。 (是的,我熟悉使用splitcat来解决问题的方法;但我正在考虑编辑,尤其是控制台/诅咒编辑,它们可以免除这些并节省我们的时间/这种方法所需的延迟和磁盘空间开销。)

答案 2 :(得分:20)

由于您不需要实际编辑文件:

  1. view(或vim -R)应该可以很好地处理大型文件。
  2. 或者您可以使用moreless

答案 3 :(得分:7)

我根据Florian的回答写了一个小脚本,使用nano(我最喜欢的编辑器):

#!/bin/sh

if [ "$#" -ne 3 ]; then
  echo "Usage: $0 hugeFilePath startLine endLine" >&2
  exit 1
fi

sed -n -e $2','$3'p' -e $3'q' $1 > hfnano_temporary_file
nano hfnano_temporary_file
(head -n `expr $2 - 1` $1; cat hfnano_temporary_file; sed -e '1,'$3'd' $1) > hfnano_temporary_file2
cat hfnano_temporary_file2 > $1
rm hfnano_temporary_file hfnano_temporary_file2

像这样使用:

sh hfnano yourHugeFile 3 8

在该示例中,nano将打开第3到第8行,您可以编辑它们,当您保存并退出时,hugefile中的这些行将自动被您保存的行覆盖。

答案 4 :(得分:3)

我遇到了同样的问题,但这是一个300GB的mysql转储,我想摆脱DROP并将CREATE TABLE更改为CREATE TABLE IF NOT EXISTS所以不想运行两个调用sed。我编写了这个快速的Ruby脚本,用这些更改来欺骗文件:

#!/usr/bin/env ruby

matchers={
    %q/^CREATE TABLE `foo`/ => %q/CREATE TABLE IF NOT EXISTS `foo`/,
    %q/^DROP TABLE IF EXISTS `foo`;.*$/ => "-- DROP TABLE IF EXISTS `foo`;"
}

matchers.each_pair { |m,r|
    STDERR.puts "%s: %s" % [ m, r ]
}

STDIN.each { |line|
    #STDERR.puts "line=#{line}"
    line.chomp!
    unless matchers.length == 0
        matchers.each_pair { |m,r|
            re=/#{m}/
            next if line[re].nil?
            line.sub!(re,r)
            STDERR.puts "Matched: #{m} -> #{r}"
            matchers.delete(m)
            break
        }
    end
    puts line
}

一样调用
./mreplace.rb < foo.sql > foo_two.sql

答案 5 :(得分:3)

对于巨大的单行(打印从199的字符):

cut -c 1-99 filename

答案 6 :(得分:2)

现在已经很晚了,但是如果您只想浏览文件而不进行编辑,那么cat也可以完成这项工作。

% cat filename | less

或者简单:

% less filename

答案 7 :(得分:1)

emacs可以很好地处理100兆字节的文件,我已经在日志文件中使用它而没有太多麻烦。

但通常当我有某种分析任务时,我发现编写一个perl脚本是一个更好的选择。

答案 8 :(得分:0)

旧线程。但不过(双关语:))。

 $less filename
如果你不想编辑,只是环顾四周,检查大量日志文件就会有效。

搜索较少的作品,例如vi

最好的部分,它在大多数发行版中默认可用。因此,生产环境也不会成为问题。

答案 9 :(得分:-14)

这是旧的,但是, 使用nano,vim或gvim