[vim] VIM에서 대용량 파일 작업

VIM에서 거대한 (~ 2GB) 파일을 열려고했지만 질식했습니다. 실제로 파일을 편집 할 필요가 없습니다. 효율적으로 이동하면됩니다.

VIM에서 대용량 파일로 작업하려면 어떻게해야합니까?



답변

오늘 편집 할 12GB 파일이있었습니다. vim LargeFile 플러그인이 작동하지 않았습니다. 여전히 내 모든 메모리를 사용하고 오류 메시지를 인쇄했습니다.

파일을 분할하고 부분을 편집 한 다음 다시 결합합니다. 그래도 두 배의 디스크 공간이 필요합니다.

  • 편집하려는 줄을 둘러싼 항목을 찾으십시오.

    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)과 결합하고이 결합 된 행 세트를 사용하여 HUGEFILE에 해당 (이 경우 상위 5 개 줄)를 입력하고 모두 새 파일에 씁니다.

    HUGEFILE.new이제 편집 된 파일이되며 원본을 삭제할 수 있습니다 HUGEFILE.


답변

이것은 수년 동안 반복되는 질문이었습니다. (숫자는 계속 바뀌지 만 개념은 동일합니다. 메모리보다 큰 파일을 어떻게 보거나 편집합니까?)

분명히 more또는 less좋은 단지 파일 — 읽기에 접근 할 수 있습니다 less, 심지어 이벤트 vi스크롤 및 검색을위한 키 바인딩 등이.

“대용량 파일”에 대한 Freshmeat 검색은 두 명의 편집기가 특히 귀하의 필요에 적합 할 것임을 시사합니다.

하나는 lfhex … 큰 파일 16 진 편집기 (Qt에 따라 다름)입니다. 분명히 GUI 사용이 필요합니다.

다른 하나는 콘솔 사용에 적합한 것 같습니다 : hed … 그리고 vim비슷한 인터페이스 ( ex모드 포함 ?) 를 가지고 있다고 주장합니다 .

파일 전체를 메모리에로드하지 않고도 페이지를 넘길 수있는 Linux / UNIX 용 다른 편집기를 본 적이있을 것입니다. 그러나 나는 그들의 이름을 기억하지 못합니다. 나는 다른 사람들이 그러한 편집자들에게 그들의 링크를 추가하도록 장려하기 위해이 응답을 “wiki”항목으로 만들고 있습니다. (예, 저는 splitand를 사용하여 문제를 해결하는 방법에 대해 잘 알고 있습니다 cat.하지만 저는 편집자, 특히이를 제거하고 그러한 접근 방식에 수반되는 시간 / 대기 시간 및 디스크 공간 오버 헤드를 절약 할 수있는 콘솔 / 저주 편집자를 생각하고 있습니다) .


답변

실제로 파일을 편집 할 필요가 없기 때문에 :

  1. view(또는 vim -R)은 대용량 파일에서 상당히 잘 작동합니다.
  2. 아니면 사용할 수 있습니다 more또는less

답변

나는 nano (내가 가장 좋아하는 편집기)를 사용하는 Florian의 답변을 기반으로 작은 스크립트를 작성했습니다.

#!/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의 해당 행이 저장된 행으로 자동으로 덮어 쓰여집니다.


답변

저도 같은 문제를 겪고 있지만, 그것은 3백기가바이트 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


답변

한 줄짜리 거대한 경우 (에서 1~ 까지 문자 인쇄 99) :

cut -c 1-99 filename


답변

이미 늦었지만 편집하지 않고 파일을 탐색하려는 경우 cat에도 작업을 수행 할 수 있습니다.

% cat filename | less

또는 간단하게 :

% less filename