2009-10-19 22 views
99

Tôi đã thử mở một tệp lớn (~ 2GB) trong VIM nhưng nó bị nghẹt thở. Tôi không thực sự cần phải chỉnh sửa các tập tin, chỉ cần nhảy xung quanh hiệu quả.Làm việc với các tệp lớn trong VIM

Tôi có thể làm việc với các tệp rất lớn trong VIM bằng cách nào?

+4

Vim sẽ không sao miễn là bạn ': thiết binary' đầu tiên ... – ephemient

+1

Đây là một mục tiêu tốt cho một mới hệ thống tập tin cầu chì! ** splitfs ** hoặc một cái gì đó như thế ... Tôi đang ở trong đó! – rodrigo

+1

Quá muộn ... điều này đã tồn tại: http://sourceforge.net/projects/joinsplitfs/ – rodrigo

Trả lời

1

emacs hoạt động rất tốt với các tệp trong 100 megabyte, tôi đã sử dụng nó trên tệp nhật ký mà không gặp quá nhiều rắc rối.

Nhưng nói chung khi tôi có một số loại nhiệm vụ phân tích, tôi thấy viết một kịch bản perl một lựa chọn tốt hơn.

18

Vì bạn không cần phải thực sự chỉnh sửa các file:

  1. view (hoặc vim -R) nên hoạt động khá tốt trên các tập tin lớn.
  2. Hoặc bạn có thể sử dụng more hoặc less
+3

vim với "-R" vẫn cuộn cảm. Ít hơn là một ý tưởng hay. – hoju

+0

Bởi "chokes" bạn có nghĩa là phải mất một thời gian để mở? Hoặc thực sự bị treo? Phải mất hơn 4 phút trên hộp Linux không phải của tôi gần đây để mở tệp 2,7 GB trong 'chế độ xem' (chỉ cần thử và đã định thời gian). Cấp, đó không phải là chính xác ngay lập tức, nhưng nó hoạt động. – ChssPly76

+0

Vâng nó quầy hàng. Tôi chắc chắn nếu tôi chờ đợi nó sẽ mở ra cuối cùng. Tôi đã đi với ít hơn bởi vì nó mở ra ngay lập tức và tôi đang sử dụng để chuyển hướng. – hoju

28

Đây là một câu hỏi lặp đi lặp lại trong nhiều năm. (Các con số tiếp tục thay đổi, nhưng khái niệm này là như nhau: làm thế nào để xem hoặc chỉnh sửa các file có dung lượng lớn hơn bộ nhớ)

Rõ ràng more hoặc less là cách tiếp cận tốt để chỉ đọc các tập tin --- less thậm chí cung cấp vi như keybindings để cuộn và tìm kiếm.

Một tìm kiếm trên Freshmeat trên "tệp lớn" cho thấy rằng hai trình chỉnh sửa sẽ đặc biệt phù hợp với nhu cầu của bạn.

Có thể là: lfhex ... trình chỉnh sửa tệp hex lớn (tùy thuộc vào Qt). Đó là một, rõ ràng, đòi hỏi phải sử dụng một GUI.

Loại khác có vẻ phù hợp với giao diện điều khiển sử dụng: hed ... và nó tuyên bố có giao diện vim giống (bao gồm chế độ ex?).

Tôi chắc chắn rằng tôi đã thấy các trình soạn thảo khác cho Linux/UNIX có thể trang qua các tệp mà không cần tải toàn bộ bộ nhớ của chúng vào bộ nhớ. Tuy nhiên, tôi không nhớ bất kỳ tên nào của họ. Tôi đang thực hiện phản hồi này một mục "wiki" để khuyến khích người khác thêm liên kết của họ vào các biên tập viên như vậy. (Có, tôi quen với các cách giải quyết vấn đề bằng cách sử dụng splitcat; nhưng tôi đang nghĩ đến các biên tập viên, đặc biệt là các trình chỉnh sửa/nguyền rủa có thể phân phối và tiết kiệm thời gian/thời gian và không gian đĩa entail).

+1

ít hoạt động tuyệt vời hơn –

74

Tôi đã có tệp 12GB để chỉnh sửa ngay hôm nay. Các plugin LargeFile vim đã không làm việc cho tôi. Nó vẫn còn sử dụng hết bộ nhớ của tôi và sau đó in một thông báo lỗi :-(Tôi không thể sử dụng hexedit cho một trong hai, vì nó không thể chèn bất cứ điều gì, chỉ cần ghi đè lên Đây là một cách tiếp cận khác:

Bạn chia tệp, chỉnh sửa . các bộ phận và sau đó kết hợp lại nó bạn vẫn cần phải gấp đôi dung lượng đĩa mặc dù

  • Grep cho một cái gì đó xung quanh dòng bạn muốn chỉnh sửa:.

    grep -n 'something' HUGEFILE | head -n 1 
    
  • Extract rằng phạm vi của tập tin. Nói những dòng bạn muốn chỉnh sửa ở dòng 4 d 5.Sau đó làm:

    sed -n -e '4,5p' -e '5q' HUGEFILE > SMALLPART 
    
    • Tùy chọn -n là cần thiết để ngăn chặn hành vi mặc định của sed để in tất cả mọi thứ
    • 4,5p in dòng 4 và 5
    • 5q hủy bỏ sed sau khi dây chuyền chế biến 5
  • Chỉnh sửa SMALLPART bằng trình chỉnh sửa yêu thích của bạn.

  • Kết hợp các file:

    (head -n 3 HUGEFILE; cat SMALLPART; sed -e '1,5d' HUGEFILE) > HUGEFILE.new 
    
    • ví dụ: chọn tất cả các dòng trước dòng thay đổi nội dung từ các HUGEFILE (mà trong trường hợp này là 3 dòng đầu), kết hợp nó với các dòng chỉnh sửa (trong trường hợp này dòng 4 và 5) và sử dụng tập hợp các dòng này để thay thế tương đương (trong trường hợp này là 5 hàng đầu) trong HUGEFILE và ghi tất cả vào một tệp mới.

    HUGEFILE.new giờ sẽ là tệp đã chỉnh sửa của bạn, bạn có thể xóa HUGEFILE gốc.

-14

này là cũ nhưng, sử dụng nano, vim hoặc gvim

+3

theo mặc định vim cuộn cảm – hoju

+4

Những công cụ này không có gì để giải quyết vấn đề. –

+1

nano lấp đầy bộ nhớ và chết trên tôi. –

2

Đó là đã muộn nhưng nếu bạn chỉ muốn điều hướng thông qua các tập tin mà không cần chỉnh sửa nó, cat có thể thực hiện công việc quá.

% cat filename | less 

hoặc cách khác đơn giản:

% less filename 
+5

Lưu ý rằng 'cat'ting tập tin đầu tiên là điên rồ ngu ngốc, vì nó có nghĩa là tập tin sẽ được đầy đủ trong bộ nhớ (vì vậy' ít hơn có thể tìm kiếm các tập tin) hoặc nó không thể được tìm kiếm ở tất cả; 'cat' chỉ cung cấp luồng đầu ra tĩnh. – Smar

2

tôi đã cùng một vấn đề, nhưng nó đã được một bãi chứa 300GB mysql và tôi muốn thoát khỏi DROP và thay đổi CREATE TABLE-CREATE TABLE IF NOT EXISTS nên không muốn để chạy hai lời gọi của sed. Tôi đã viết kịch bản Ruby nhanh chóng này để lừa các tập tin với những thay đổi đó:

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

Được triệu gọi như

./mreplace.rb <foo.sql> foo_two.sql 
+0

Chỉ cần lưu ý để chạy, để chạy nó như một exe yêu cầu 'chmod + x mreplace.rb' trước, bạn cũng có thể chỉ cần' ruby ​​mreplace.rb ..' – Smar

+0

Cảm ơn @Steeve McCauley! Công việc tốt đẹp. Chính xác những gì tôi đang tìm kiếm khi tìm kiếm câu trả lời cho câu hỏi này. –

6

Tôi đã viết một kịch bản ít dựa trên câu trả lời Florian có sử dụng nano (soạn thảo yêu thích của tôi):

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

Sử dụng nó như thế này:

sh hfnano yourHugeFile 3 8 

Trong ví dụ đó, nano sẽ mở ra các dòng từ 3 đến 8, bạn có thể chỉnh sửa chúng, và khi bạn lưu và thoát, những dòng trong tệp tin khổng lồ sẽ tự động được ghi đè bằng các dòng đã lưu của bạn.

-1

Chủ đề cũ. Nhưng tuy nhiên (pun :)).

$less filename 

ít hoạt động hiệu quả hơn nếu bạn không muốn chỉnh sửa và chỉ xem xét trường hợp kiểm tra tệp nhật ký khổng lồ.

Tìm kiếm trong các công trình ít hơn như vi

Phần hay nhất, nó có sẵn theo mặc định trên hầu hết các bản phân phối. Vì vậy, sẽ không có vấn đề cho môi trường sản xuất là tốt.

+0

Tìm kiếm trong tệp văn bản 650MB không được chứng minh là PITA. Sử dụng vim với các công trình LargeFile giống như một sự quyến rũ. – MariusCC

+2

@MariusCC Sau đó, bạn đã không làm việc với hơn 2 GB tệp, nét duyên dáng của bạn sẽ mờ dần với sự cố! – deepdive

1

Đối khổng lồ một lớp lót (in ký tự từ 1 để 99):

cut -c 1-99 filename 
Các vấn đề liên quan