2013-08-14 30 views
19

Tôi đang điều tra một tệp UTF-8 chủ yếu với nhiều dòng dài. Tuy nhiên, tệp không phải là tệp văn bản hoàn toàn, có một số rác. Để tìm điểm ưa thích của tôi, tôi đang sử dụng hdgrep.Chuyển đến địa chỉ byte trong vim?

Vì vậy, tại một thời điểm nào đó tôi biết điều đó tôi quan tâm, ví dụ: 0000301a, vì vậy tôi muốn nhanh chóng mở tệp trong Vim và chuyển đến vị trí đó.

Ví dụ (thực sự là một tập tin nhỏ, ở đây vị trí là 0000001c):

[email protected]:~$ hd file | grep -C 10 \ 00\ 
00000000 6c 69 6e 65 31 0a 6c 69 6e 65 32 0a 6c 69 6e 65 |line1.line2.line| 
00000010 33 0a 6c 69 6e 65 34 0a 6c 69 6e 65 00 35 0a 6c |3.line4.line.5.l| 
00000020 69 6e 65 36 0a 6c 69 6e 65 37 0a 6c 69 6e 65 38 |ine6.line7.line8| 
00000030 0a 6c 69 6e 65 39 0a 6c 69 6e 65 31 30 0a  |.line9.line10.| 
0000003e 
[email protected]:~$ 

Có một trick trong Vim để chuyển đến một vị trí byte? Hoặc càng gần càng tốt?

+0

Không chắc chắn nếu điều này sẽ làm việc trong trường hợp của bạn, nhưng bạn đã thử chuyển đổi bù sang thập phân sau đó sử dụng ': goto 1234'? –

+1

Bạn không phải sử dụng số thập lục phân bằng cách này, bạn có thể định dạng đầu ra hd theo bất kỳ cách nào bạn muốn. Hãy xem trang người đàn ông. – glts

Trả lời

34

Có, có. Đó là lệnh chế độ thông thường go.

Từ :h go:

[đếm] đi               Đến {count} byte trong bộ đệm.

Ví dụ, 42go nhảy đến byte 42.

Để nhảy đến một thập lục phân hoặc địa chỉ bát phân bạn sẽ cần phải xây dựng một lệnh với :normal! go hoặc tương đương :goto, và str2nr() hoặc printf() chức năng.

:exe 'normal! ' . str2nr('0x2a', 16) . 'go' 
:exe 'goto' str2nr('0x2a', 16) 
+0

Câu trả lời tương tự [ở đây] (http://stackoverflow.com/q/543738), nhân tiện. – glts

+3

Xem ra mặc dù: vị trí byte của Vim là 1 dựa trên (như số cột và số dòng), không dựa trên 0. – Oberon

3

Có, sử dụng :help starting.txt bạn có thể tìm trợ giúp về tất cả các đối số dòng lệnh vim.

Sử dụng lệnh goto trên được đưa ra bởi một số người khác, bạn sẽ có thể cung cấp cho vim một lệnh từ dòng lệnh để đi đến byte bù đắp như

vim "+exe 'goto' str2nr('0x2a', 16)" file

Có một lá cờ thời gian biên dịch mô tả tại :help +byte_offset bạn có thể kiểm tra bằng cách sử dụng lệnh :ve. Phiên bản Ubuntu của tôi đã được biên dịch theo mặc định.

+1

'vim --version | grep byte_offset' và tìm kiếm '+' hoặc '-' thường nhanh hơn khi quét': phiên bản' – FDinoff

+1

Mặc dù ': echo has (" byte_offset ")' thậm chí còn nhanh hơn. Chỉ cần kiểm tra để thấy rằng đầu ra là 1. – FDinoff

3

Trong khi câu hỏi này có giá trị riêng của nó, tôi có thể đề nghị bạn đang làm toàn bộ điều này theo kiểu vòng xoay, sử dụng tất cả hd, grep, Vim và vỏ không?

Tại sao không sử dụng Vim và chỉ Vim cho toàn bộ quá trình?

Điều quan trọng là tại :h 23.4, "Tệp nhị phân": Vim có thể là trình chỉnh sửa hex của bạn.

Sau khi khởi động Vim với tập tin của bạn, vim -b myfile, các quy trình làm việc trở thành:

:%!xxd -g1<Enter> 
/00 <Enter> 
... 
... 
:%!xxd -r<Enter> 

Hãy chắc chắn để đọc :h hex-editing cũng vậy, để biết thêm chi tiết.

Các vấn đề liên quan