VIM에서 거대한 (~ 2GB) 파일을 열려고했지만 질식했습니다. 실제로 파일을 편집 할 필요가 없습니다. 효율적으로 이동하면됩니다.
VIM에서 대용량 파일로 작업하려면 어떻게해야합니까?
:set binary
처음 에는 괜찮을 것입니다 ...
VIM에서 거대한 (~ 2GB) 파일을 열려고했지만 질식했습니다. 실제로 파일을 편집 할 필요가 없습니다. 효율적으로 이동하면됩니다.
VIM에서 대용량 파일로 작업하려면 어떻게해야합니까?
:set binary
처음 에는 괜찮을 것입니다 ...
답변:
오늘 편집 할 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.new
이제 편집 된 파일이되며 원본을 삭제할 수 있습니다 HUGEFILE
.
이것은 수년 동안 반복되는 질문이었습니다. (숫자는 계속 바뀌지 만 개념은 동일합니다. 메모리보다 큰 파일을 어떻게 보거나 편집합니까?)
분명히 more
또는 less
좋은 단지 파일 --- 읽기에 접근 할 수 있습니다 less
, 심지어 이벤트 vi
스크롤 및 검색을위한 키 바인딩 등이.
"대용량 파일"에 대한 Freshmeat 검색은 두 명의 편집기가 특히 귀하의 필요에 적합 할 것임을 시사합니다.
하나는 lfhex ... 큰 파일 16 진 편집기 (Qt에 따라 다름)입니다. 분명히 GUI 사용이 필요합니다.
다른 하나는 콘솔 사용에 적합한 것 같습니다 : hed ... 그리고 vim
비슷한 인터페이스 ( ex
모드 포함 ?) 를 가지고 있다고 주장합니다 .
파일 전체를 메모리에로드하지 않고도 페이지를 넘길 수있는 Linux / UNIX 용 다른 편집기를 본 적이있을 것입니다. 그러나 나는 그들의 이름을 기억하지 못합니다. 나는 다른 사람들이 그러한 편집자들에게 그들의 링크를 추가하도록 장려하기 위해이 응답을 "wiki"항목으로 만들고 있습니다. (예, 저는 split
and를 사용하여 문제를 해결하는 방법에 대해 잘 알고 있습니다 cat
.하지만 저는 편집자, 특히이를 제거하고 그러한 접근 방식에 수반되는 시간 / 대기 시간 및 디스크 공간 오버 헤드를 절약 할 수있는 콘솔 / 저주 편집자를 생각하고 있습니다) .
나는 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
chmod +x mreplace.rb
먼저 exe가 필요로하는대로 실행하려면 다음과 같이 할 수 있습니다.ruby mreplace.rb ..
한 줄짜리 거대한 경우 (에서 1
~ 까지 문자 인쇄 99
) :
cut -c 1-99 filename
오래된 스레드. 그럼에도 불구하고 (말장난 :)).
$less filename
편집을 원하지 않고 거대한 로그 파일을 조사하는 경우를 둘러 보면 덜 효율적으로 작동합니다.
vi와 같은 적은 작품에서 검색
가장 좋은 점은 대부분의 배포판에서 기본적으로 사용할 수 있다는 것입니다. 따라서 프로덕션 환경에서도 문제가되지 않습니다.
이것은 오래되었지만 nano, vim 또는 gvim을 사용하십시오.