Tôi đã thử mở một tệp lớn (~ 2GB) trong VIM nhưng nó bị nghẹt. Tôi thực sự không cần chỉnh sửa tệp, chỉ cần nhảy xung quanh một cách hiệu quả.
Làm cách nào để làm việc với các tệp rất lớn trong VIM?
:set binary
đầu tiên ...
Tôi đã thử mở một tệp lớn (~ 2GB) trong VIM nhưng nó bị nghẹt. Tôi thực sự không cần chỉnh sửa tệp, chỉ cần nhảy xung quanh một cách hiệu quả.
Làm cách nào để làm việc với các tệp rất lớn trong VIM?
:set binary
đầu tiên ...
Câu trả lời:
Tôi đã có một tệp 12GB để chỉnh sửa hôm nay. Plugin vim LargeFile không hoạt động với tôi. Nó vẫn sử dụng hết bộ nhớ của tôi và sau đó in ra một thông báo lỗi :-(. Tôi cũng không thể sử dụng hexedit vì nó không thể chèn bất cứ thứ gì, chỉ cần ghi đè. Đây là một cách tiếp cận thay thế:
Bạn chia nhỏ tệp, chỉnh sửa các phần và sau đó kết hợp lại. Bạn vẫn cần gấp đôi dung lượng ổ đĩa.
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
Giải nén dải tệp đó. Giả sử các dòng bạn muốn chỉnh sửa nằm ở dòng 4 và 5. Sau đó thực hiện:
sed -n -e '4,5p' -e '5q' HUGEFILE > SMALLPART
-n
tùy chọ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à 55q
hủy bỏ sed sau khi xử lý dòng 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 tệp:
(head -n 3 HUGEFILE; cat SMALLPART; sed -e '1,5d' HUGEFILE) > HUGEFILE.new
HUGEFILE.new
bây giờ sẽ là tệp đã chỉnh sửa của bạn, bạn có thể xóa bản gốc HUGEFILE
.
Đây đã là một câu hỏi lặp đi lặp lại trong nhiều năm. (Các con số liên tục thay đổi, nhưng khái niệm thì giống nhau: làm cách nào để xem hoặc chỉnh sửa các tệp lớn hơn bộ nhớ?)
Rõ ràng more
hoặc less
là những cách tiếp cận tốt để chỉ đơn thuần đọc các tệp --- less
thậm chí còn cung cấp vi
như keybindings để cuộn và tìm kiếm.
Một Freshmeat tìm kiếm trên "các tập tin lớn" gợi ý rằng hai biên tập viên sẽ được đặc biệt phù hợp với nhu cầu của bạn.
Một sẽ là: lfhex ... một trình chỉnh sửa tệp hex lớn (phụ thuộc vào Qt). Điều đó, rõ ràng, đòi hỏi phải sử dụng GUI.
Một cái khác dường như phù hợp với việc sử dụng bảng điều khiển: hed ... và nó tuyên bố có vim
giao diện giống như (bao gồm một ex
chế độ?).
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ể duyệt qua các tệp mà không cần tải toàn bộ vào bộ nhớ. Tuy nhiên, tôi không nhớ tên của họ. Tôi đặt câu trả lời này thành một mục "wiki" để khuyến khích những người khác thêm liên kết của họ vào những người biên tập như vậy. (Có, tôi quen thuộc với các cách giải quyết vấn đề bằng cách sử dụng split
và cat
; nhưng tôi đang nghĩ đến các trình chỉnh sửa, đặc biệt là các trình chỉnh sửa console / nguyền rủa có thể phân phối với điều đó và tiết kiệm cho chúng tôi thời gian / độ trễ và chi phí không gian đĩa mà các cách tiếp cận như vậy đòi hỏi) .
Vì bạn không cần thực sự chỉnh sửa tệp:
view
(chỉ cần thử và tính giờ). Được, điều đó không chính xác ngay lập tức, nhưng nó hoạt động.
Tôi đã viết một kịch bản nhỏ dựa trên câu trả lời của Florian sử dụng nano (trình 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, các dòng đó trong tệp tin khổng lồ sẽ tự động được ghi đè lên các dòng đã lưu của bạn.
Tôi đã gặp vấn đề tương tự, nhưng đó là kết xuất mysql 300GB và tôi muốn loại bỏ DROP
và thay đổi CREATE TABLE
thành CREATE TABLE IF NOT EXISTS
vì vậy không muốn chạy hai lệnh gọi sed
. Tôi đã viết script Ruby nhanh này để đánh lừa tệp 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 mời như thế
./mreplace.rb < foo.sql > foo_two.sql
chmod +x mreplace.rb
đầu tiên, bạn cũng có thể chỉruby mreplace.rb ..
Đối với một dòng chữ lớn (in các ký tự từ 1
đến 99
):
cut -c 1-99 filename
Đã muộn nhưng nếu bạn chỉ muốn điều hướng qua tệp mà không cần chỉnh sửa nó, bạn cat
cũng có thể thực hiện công việc.
% cat filename | less
hoặc đơn giản hơn:
% less filename
cat
việc kiểm tra tệp trước tiên là cực kỳ ngu ngốc, vì nó có nghĩa là tệp sẽ hoàn toàn nằm trong bộ nhớ (vì vậy less
có thể tìm kiếm tệp) hoặc không thể tìm thấy nó; cat
chỉ đưa ra luồng đầu ra tĩnh.
Chủ đề cũ. Nhưng tuy nhiên (chơi chữ :)).
$less filename
hoạt động kém hiệu quả hơn nếu bạn không muốn chỉnh sửa và chỉ quan sát xung quanh, đó là trường hợp để kiểm tra các tệp nhật ký lớn.
Tìm kiếm trong các công việc ít hơn như vi
Phần tốt 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 đề gì đối với môi trường sản xuất.
cái này cũ rồi nhưng sử dụng nano, vim hoặc gvim