VIMで巨大な(〜2GB)ファイルを開こうとしましたが、詰まってしまいました。実際にファイルを編集する必要はありません。効率的にジャンプするだけです。
VIM で非常に大きなファイルを操作するにはどうすればよいですか?
VIMで巨大な(〜2GB)ファイルを開こうとしましたが、詰まってしまいました。実際にファイルを編集する必要はありません。効率的にジャンプするだけです。
VIM で非常に大きなファイルを操作するにはどうすればよいですか?
今日、編集する 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,5p
4行目と5行目を印刷します5q
5 行目の処理後に sed を中止しますSMALLPART
お気に入りのエディターを使用して編集します。
ファイルを結合します。
(head -n 3 HUGEFILE; cat SMALLPART; sed -e '1,5d' HUGEFILE) > HUGEFILE.new
HUGEFILE.new
が編集済みのファイルになるので、元のファイルを削除できますHUGEFILE
。
これは何年もの間繰り返される質問でした。(数値は変わり続けていますが、概念は同じです。メモリよりも大きなファイルを表示または編集するにはどうすればよいでしょうか?)
明らかにmore
、less
単にファイルを読み取るための良いアプローチです---スクロールや検索のためのキーバインディングのようなものless
さえ提供します.vi
Freshmeatで「大きなファイル」を検索すると、2 つのエディターが特にニーズに適していることがわかります。
1 つは次のようになります: lfhex ... 大きなファイルの 16 進エディタ (Qt に依存)。明らかに、これには GUI の使用が伴います。
もう 1 つは、コンソールでの使用に適しているように思われます: hed ... に似たvim
インターフェイス (ex
モードを含む?) があると主張しています。
ファイル全体をメモリにロードせずにページを移動できる Linux/UNIX 用の他のエディタを見たことがあると思います。しかし、私は彼らの名前を思い出せません。私はこの回答を「wiki」エントリにして、他の人がそのような編集者へのリンクを追加することを奨励しています. split
(はい、私はandを使用して問題を回避する方法に精通していますcat
。しかし、エディター、特にコンソール/curses エディターを考えています。これは、それを省略して時間/レイテンシーとディスク容量のオーバーヘッドを節約できます) .
私は同じ問題を抱えていましたが、それは 300GB の mysqlダンプDROP
でした。これらの変更でファイルを複製するために、次の簡単な Ruby スクリプトを作成しました。CREATE TABLE
CREATE TABLE IF NOT EXISTS
sed
#!/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
emacs は、数百メガバイトのファイルで非常にうまく機能します。私は、ログ ファイルで問題なく使用しました。
しかし、一般的に、ある種の分析タスクがある場合は、perl スクリプトを作成する方が良い選択だと思います。
もう遅いですが、ファイルを編集せずにナビゲートしたいだけなら、それもcat
できます。
% cat filename | less
または代わりに単純です:
% less filename
これは古いですが、nano、vim、または gvim を使用してください