在VIM大文件工作(Working with huge files in VIM)

2019-08-21 03:33发布

我试图打开VIM在一个巨大的(〜2GB)文件,但它扼杀。 我实际上并不需要编辑的文件,只是跳来跳去有效。

我该如何去在VIM有非常大的文件的工作?

Answer 1:

我有一个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 
    • 即:挑从HUGEFILE(在这种情况下是前3行)所编辑的行之前的所有行,在编辑的线结合它(在这种情况下,线4和5),并使用该组合组线来代替当量(在这种情况下,顶部5行)在HUGEFILE和它全部写入一个新文件。

    HUGEFILE.new现在将你的编辑过的文件,你可以删除原始HUGEFILE



Answer 2:

这一直是多年的重复问题。 (数字不断变化,但概念是相同的:?我怎么查看或比内存大编辑的文件)

显然, moreless好方法仅仅阅读文件--- less ,甚至还提供vi样键绑定滚动和搜索。

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

其中之一是: lfhex ...大文件十六进制编辑器(它依赖于Qt的)。 那一个,很明显,需要使用GUI。

另一个似乎是适合控制台使用: 建置 ...它声称拥有一个vim样接口(包括ex模式?)。

我敢肯定,我看到其他编辑器的Linux / UNIX的是能够通过页面文件,无需加载全部到内存中。 不过,我不记得任何人的名字。 我在做这个反应的“维基”条目,鼓励他人他们的链接添加到这样的编辑器。 (是的,我熟悉的方式来解决使用问题splitcat ,但我想编辑,特别是控制台/的诅咒,可以与分发,节省我们的时间/延迟和磁盘空间开销,这种方法编辑意味着)。



Answer 3:

既然你不需要实际编辑文件:

  1. view (或vim -R )应该很好地工作在大文件。
  2. 或者你可以使用moreless


Answer 4:

我写了基于弗洛里安的答案有点脚本,使用纳米(我喜欢的编辑器):

#!/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

在这个例子中,纳米将会通过8开行3,您可以编辑它们,当你保存并退出,在hugefile那些行会自动与您保存线覆盖。



Answer 5:

我有同样的问题,但它是一个300GB的MySQL转储,我想摆脱的DROP ,改变CREATE TABLECREATE 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


Answer 6:

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

cut -c 1-99 filename


Answer 7:

这已经晚了,但如果你只是想通过文件而不进行编辑浏览, cat能也做的工作。

% cat filename | less

或可替代地简单:

% less filename


Answer 8:

emacs的工作得很好文件到兆字节的100的,我已经用它的日志文件,没有太多的麻烦。

但通常,当我有某种分析的任务,我觉得写一个perl脚本一个更好的选择。



Answer 9:

旧线。 但尽管如此(双关语:))。

 $less filename

少高效地工作,如果你不希望编辑,只是环顾这是检验巨大的日志文件的情况下。

像六少作品搜索

最好的部分,它是默认提供的大多数发行版。 所以,不会对生产环境的问题,以及。



Answer 10:

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



文章来源: Working with huge files in VIM