Jest na to wiele narzędzi:
ddto jest to, czego chcesz użyć, jeśli chcesz zablokować plik - niezawodnie odczytaj tylko określoną liczbę bajtów tylko określoną liczbę razy. Przenośnie obsługuje blokowanie i odblokowywanie strumieni plików:
tr -dc '[:graph:]' </dev/urandom |
dd bs=32 count=1 cbs=8 conv=unblock,sync 2>/dev/null
###OUTPUT###
UI(#Q5\e
BKX2?A:Z
RAxGm:qv
t!;/v!)N
Używam również trpowyżej, ponieważ może obsłużyć konwersję dowolnego bajtu ASCII na dowolny inny (lub, w tym przypadku, usunięcie dowolnego bajtu ASCII, który nie jest znakiem spacji nieprzeznaczonym do spacji). Właśnie tego użyłem w odpowiedzi na twoje inne pytanie dziś rano, kiedy to zrobiłem:
tr '>\n' '\n>' | sed 's/^>*//' | tr '\n>' '>\n'
Istnieje wiele podobnych . Ta lista powinna zawierać najniższy podzbiór wspólnego mianownika, z którym możesz się zapoznać.
Ale gdybym miał zamiar przetwarzać tekst na pliku binarnym o pojemności 2,5 GB, mógłbym zacząć od. Może dać ci jeden octal dumplub kilka innych formatów. Możesz określić wszystkie rodzaje opcji - ale zrobię tylko jeden bajt na linię w \Cformacie zmiany znaczenia:
Dane, z których będziesz uzyskiwać, odbędą regularne w dowolnych odstępach czasu, które określisz - jak pokazano poniżej. Ale najpierw - oto odpowiedź na twoje pytanie:
printf 'first\nnewline\ttab spacefoobar\0null' |
od -A n -t c -v -w1 |
sed 's/^ \{1,3\}//;s/\\$/&&/;/ /bd
/\\[0nt]/!{H;$!d};{:d
x;s/\n//g}'
Że trochę powyżej wyznacza na \newlines, \0null, \tABS i <spaces>przy zachowaniu \Cuciekł ciąg do separatora. Zwróć uwagę na używane funkcje Hi x- za każdym razem, gdy sednapotka ogranicznik, wymienia zawartość swoich buforów pamięci. W ten sposób sedzachowuje tylko tyle informacji, ile musi, aby niezawodnie rozgraniczić plik i nie ulega przepełnieniu bufora - to znaczy tak długo, jak faktycznie napotyka swoje ograniczniki. Tak długo, jak to zrobi, sedbędzie przetwarzał dane wejściowe i odbędzie je dostarczał, dopóki nie napotka EOF.
Jak widać, jego dane wyjściowe wyglądają tak:
first
\nnewline
\ttab
spacefoobar
\0null
Więc jeśli chcę foobar:
printf ... | od ... | sed ... |
sed 's/foobar/\
&\
/g'
###OUTPUT###
first
\nnewline
\ttab
space
foobar
\0null
Teraz, jeśli chcesz użyć tych Cznaków, jest to całkiem proste - ponieważ sedjuż podwójny \\ukośnik printfodwrócił wszystkie swoje pojedyncze ukośniki odwrotne, więc wykonanie z nie xargsbędzie miało problemów z produkcją danych wyjściowych zgodnie ze specyfikacją. Ale xargs zjada cytaty z powłoki, więc musisz jeszcze raz je zacytować:
printf 'nl\ntab\tspace foobarfoobar\0null' |
PIPELINE |
sed 's/./\\&/g' |
xargs printf %b |
cat -A
###OUTPUT###
nl$
tab^Ispace $
foobar$
$
foobar$
^@null%
Można to równie łatwo zapisać w zmiennej powłoki i wyprowadzić później w identyczny sposób. Ostatni sedwstawia \odwrotny ukośnik przed każdym znakiem na wejściu i to wszystko.
A oto, jak to wszystko wygląda, zanim sedsię to obejmie:
printf 'nl\ntab\tspace foobarfoobar\0null' |
od -A n -t c -v -w1
n
l
\n
t
a
b
\t
s
p
a
c
e
f
o
o
b
a
r
f
o
o
b
a
r
\0
n
u
l
l
perllubpython?