114

VIMで巨大な(〜2GB)ファイルを開こうとしましたが、詰まってしまいました。実際にファイルを編集する必要はありません。効率的にジャンプするだけです。

VIM で非常に大きなファイルを操作するにはどうすればよいですか?

4

10 に答える 10

89

今日、編集する 12GB のファイルがありました。vim LargeFile プラグインが機能しませんでした。それでもすべてのメモリを使い果たし、エラーメッセージを出力しました:-(。何も挿入できないため、どちらにもhexeditを使用できませんでした。上書きするだけです。別のアプローチは次のとおりです。

ファイルを分割し、パーツを編集してから再結合します。ただし、それでも 2 倍のディスク容量が必要です。

  • 編集したい行を囲む何かを grep します。

    grep -n 'something' HUGEFILE | head -n 1
    
  • ファイルのその範囲を抽出します。編集したい行が 4 行目と 5 行目だとします。次に、次のようにします。

    sed -n -e '4,5p' -e '5q' HUGEFILE > SMALLPART
    
    • この-nオプションは、sed のデフォルトの動作を抑制してすべてを出力するために必要です。
    • 4,5p4行目と5行目を印刷します
    • 5q5 行目の処理後に sed を中止します
  • SMALLPARTお気に入りのエディターを使用して編集します。

  • ファイルを結合します。

    (head -n 3 HUGEFILE; cat SMALLPART; sed -e '1,5d' HUGEFILE) > HUGEFILE.new 
    
    • つまり、HUGEFILE から編集された行の前のすべての行 (この場合は上位 3 行) を選択し、それを編集された行 (この場合は 4 行目と 5 行目) と結合し、この結合された行のセットを使用して、 HUGEFILE で同等のもの (この場合は上位 5 行) を作成し、それをすべて新しいファイルに書き込みます。

    HUGEFILE.newが編集済みのファイルになるので、元のファイルを削除できますHUGEFILE

于 2011-07-29T14:26:51.997 に答える
31

これは何年もの間繰り返される質問でした。(数値は変わり続けていますが、概念は同じです。メモリよりも大きなファイルを表示または編集するにはどうすればよいでしょうか?)

明らかにmoreless単にファイルを読み取るための良いアプローチです---スクロールや検索のためのキーバインディングのようなものlessさえ提供します.vi

Freshmeatで「大きなファイル」を検索すると、2 つのエディターが特にニーズに適していることがわかります。

1 つは次のようになります: lfhex ... 大きなファイルの 16 進エディタ (Qt に依存)。明らかに、これには GUI の使用が伴います。

もう 1 つは、コンソールでの使用に適しているように思われます: hed ... に似たvimインターフェイス (exモードを含む?) があると主張しています。

ファイル全体をメモリにロードせずにページを移動できる Linux/UNIX 用の他のエディタを見たことがあると思います。しかし、私は彼らの名前を思い出せません。私はこの回答を「wiki」エントリにして、他の人がそのような編集者へのリンクを追加することを奨励しています. split(はい、私はandを使用して問題を回避する方法に精通していますcat。しかし、エディター、特にコンソール/curses エディターを考えています。これは、それを省略して時間/レイテンシーとディスク容量のオーバーヘッドを節約できます) .

于 2009-10-20T03:28:01.647 に答える
25

実際にファイルを編集する必要がないため:

  1. view(またはvim -R) は、大きなファイルでも適切に機能するはずです。
  2. moreまたは、またはを使用できますless
于 2009-10-19T23:48:28.867 に答える
3

私は同じ問題を抱えていましたが、それは 300GB の mysqlダンプDROPでした。これらの変更でファイルを複製するために、次の簡単な Ruby スクリプトを作成しました。CREATE TABLECREATE TABLE IF NOT EXISTSsed

#!/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
于 2013-02-09T14:59:56.627 に答える
1

emacs は、数百メガバイトのファイルで非常にうまく機能します。私は、ログ ファイルで問題なく使用しました。

しかし、一般的に、ある種の分析タスクがある場合は、perl スクリプトを作成する方が良い選択だと思います。

于 2009-10-19T23:42:38.483 に答える
1

もう遅いですが、ファイルを編集せずにナビゲートしたいだけなら、それもcatできます。

% cat filename | less

または代わりに単純です:

% less filename
于 2012-04-15T19:23:33.300 に答える
-15

これは古いですが、nano、vim、または gvim を使用してください

于 2012-02-29T07:58:54.033 に答える