Memiliki byte offset untuk suatu file.
Apakah ada alat yang memberikan nomor baris untuk byte ini?
- Hitungan byte dimulai dengan nol, seperti pada: byte pertama adalah 0 bukan 1.
- Nomor baris dimulai dengan 1.
- File dapat memiliki teks, blob "biner", karakter multibyte, dll. Tetapi bagian yang saya minati: Akhir file, hanya memiliki ASCII.
Contoh, file:
001
002
003 <<-- first zero on this line is byte 8
004
Memiliki byte offset 8
yang akan memberi saya jalur 3
.
Kira saya bisa menggunakan sesuatu seperti ini untuk menemukan nomor baris:
Sebuah. tail -c+(offset + 1) file | wc -l
, Di sini +1
sebagai tail
jumlah dari 1.
b. wc -l file
c. Lalu tail -n+num
di mana num
adalaha - b + 1
Tapi ... adakah alat yang cukup umum yang bisa memberi saya num
langsung?
Edit, sesat: atau lebih jelas:
head -c+offset file | wc -l
text-processing
utilities
pengguna367890
sumber
sumber
0x0a
byte.:echo byte2line(offset+1)
.vim -b
danvim
+set binary
+ buka file itu bisa rusak. (Ah. Tiba-tiba saya ingat plugin mana yang mengacaukannya). Tapi, bagaimanapun, ketika saya menggunakan ini dalam batch dan dalam kombinasi dengan berbagai skrip, Vim awalnya ditinggalkan. Tapi +1 tetap.0xa
mana saja. Konsep garis dalam file biner tidak ada artinya.Jawaban:
Dalam contoh Anda,
byte nomor 8 adalah baris kedua, bukan
0
baris berikutnya.Berikut ini akan memberi Anda jumlah baris penuh setelah
$b
byte:Ini akan melaporkan
2
denganb
set ke 8 dan akan melaporkan1
denganb
set ke 7.The
dd
utilitas, cara itu digunakan di sini, akan membaca dari file tersebutdata.in
, dan akan membaca$b
blok dari ukuran 1 byte.Seperti yang ditunjukkan "icarus" dengan benar di komentar di bawah, penggunaannya
bs=1
tidak efisien. Lebih efisien, dalam kasus khusus ini, untuk bertukarbs
dancount
:Ini akan memiliki efek yang sama dengan
dd
perintah pertama , tetapi hanya akan membaca satu blok$b
byte.The
wc
jumlah utilitas baris, dan "garis" di Unix selalu diakhiri oleh baris baru. Jadi perintah di atas masih akan mengatakan2
jika Anda menetapkanb
apa pun yang lebih rendah dari 12 (baris baru berikut). Karenanya, hasil yang Anda cari adalah angka apa pun yang dilaporkan dalam saluran pipa di atas, ditambah 1.Ini jelas juga akan menghitung baris baru acak di bagian gumpalan biner dari file Anda yang mendahului teks ASCII. Jika Anda tahu di mana bit ASCII dimulai, Anda bisa menambahkan
skip="$offset"
kedd
perintah, di mana$offset
jumlah byte untuk dilewati ke file.sumber
head: unknown option -- c
$(( b - 1 ))
.Saat ini tidak ada alat khusus seperti itu, meskipun dapat dilakukan dengan cukup mudah dengan python:
Penggunaannya sederhana:
Uji coba:
Ini adalah skrip yang sangat cepat dan sederhana. Itu tidak memeriksa apakah file tersebut kosong atau tidak, sehingga hanya berfungsi pada file yang tidak kosong.
sumber
Lacak byte yang terlihat dan lepaskan nomor baris saat ini jika offset yang diberikan berada dalam jumlah:
Atau panjang lebar:
sumber
perl -0nE exp
menghirup input ke dalam$_
dan mengeksekusi expsubstr(string,0,8)
memilih 8 byte pertamay/\n//
menghapus\n
dan mengembalikan nomornyasumber