Posiadanie przesunięcia bajtu dla pliku.
Czy istnieje narzędzie, które podaje numer linii dla tego bajtu?
- Liczba bajtów zaczynająca się od zera, jak w: pierwszy bajt to 0, a nie 1.
- Numer linii zaczynający się od 1.
- Plik może zawierać zarówno zwykły tekst, „binarne” obiekty BLOB, znaki wielobajtowe itp. Ale sekcja, która mnie interesuje: Koniec pliku, ma tylko ASCII.
Przykład pliku:
001
002
003 <<-- first zero on this line is byte 8
004
Posiadanie przesunięcia bajtu 8
, które dałoby mi linię 3
.
Chyba mógłbym użyć czegoś takiego do znalezienia numeru linii:
za. tail -c+(offset + 1) file | wc -l
, tutaj +1
jak się tail
liczy od 1.
b. wc -l file
do. Więc tail -n+num
gdzie num
jesta - b + 1
Ale ... czy jest jakieś dość powszechne narzędzie, które może mi num
bezpośrednio dać ?
Edytuj, err: lub bardziej oczywiste:
head -c+offset file | wc -l
text-processing
utilities
użytkownik367890
źródło
źródło
0x0a
bajtami.:echo byte2line(offset+1)
.vim -b
i + otwartym pliku został uszkodzony. (Ach. Nagle przypominam sobie, która wtyczka to popsuła). Ale w każdym razie, ponieważ używam tego w partiach i w połączeniu z szeregiem skryptów, Vim został wcześnie porzucony. Ale i tak +1.vim
set binary
0xa
dowolne miejsce. Pojęcie wierszy w pliku binarnym jest bez znaczenia.Odpowiedzi:
W twoim przykładzie
bajt numer 8 to druga nowa linia, a nie
0
następna linia.Poniżej podano liczbę pełnych wierszy po
$b
bajtach:Raportuje
2
zb
ustawionym na 8 i będzie raportował1
zb
ustawionym na 7.dd
Użyteczność, sposób jest używany tutaj, będą odczytywane z plikudata.in
i odczyta$b
blokach o rozmiarze 1 bajta.Jak słusznie wskazuje „Ikar” w poniższych komentarzach, używanie
bs=1
jest nieefektywne. W tym konkretnym przypadku bardziej wydajne jest zamianabs
icount
:Będzie to miało taki sam efekt jak pierwsze
dd
polecenie, ale odczyta tylko jeden blok$b
bajtów.Do
wc
liczy użytkowych znaki nowej linii, i „linia” w Unix zawsze jest zakończony znakiem nowej linii. Tak więc powyższe polecenie nadal powie,2
jeśli ustawisz wartośćb
niższą niż 12 (następna nowa linia). Wynik, którego szukasz, to zatem dowolna liczba z powyższych raportów potoku plus 1.To oczywiście policzy również losowe znaki nowej linii w części binarnego obiektu blob, która poprzedza tekst ASCII. Jeśli wiesz, gdzie zaczyna się bit ASCII, możesz dodać
skip="$offset"
dodd
polecenia, gdzie$offset
jest liczba bajtów, które należy pominąć w pliku.źródło
head: unknown option -- c
$(( b - 1 ))
.Obecnie nie ma takiego dedykowanego narzędzia, chociaż można to zrobić dość łatwo w Pythonie:
Użycie jest proste:
Testowe uruchomienie:
To jest bardzo szybki i prosty skrypt. Nie sprawdza, czy plik jest pusty, czy nie, więc działa tylko na niepustych plikach.
źródło
Śledź widoczne bajty i emituj bieżący numer linii, jeśli podane przesunięcie będzie mieściło się w sumie:
Lub na długość:
źródło
perl -0nE exp
wtapia wejście w$_
i wykonuje expsubstr(string,0,8)
wybiera pierwsze 8 bajtówy/\n//
usuwa\n
i zwraca jego numerźródło