Jest na to wiele narzędzi:
dd
to 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ż tr
powyż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 dump
lub kilka innych formatów. Możesz określić wszystkie rodzaje opcji - ale zrobię tylko jeden bajt na linię w \C
formacie zmiany znaczenia:
Dane, z których będziesz uzyskiwać, od
bę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 \n
ewlines, \0
null, \t
ABS i <spaces>
przy zachowaniu \C
uciekł ciąg do separatora. Zwróć uwagę na używane funkcje H
i x
- za każdym razem, gdy sed
napotka ogranicznik, wymienia zawartość swoich buforów pamięci. W ten sposób sed
zachowuje 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, sed
będzie przetwarzał dane wejściowe i od
bę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 C
znaków, jest to całkiem proste - ponieważ sed
już podwójny \\
ukośnik printf
odwrócił wszystkie swoje pojedyncze ukośniki odwrotne, więc wykonanie z nie xargs
bę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 sed
wstawia \
odwrotny ukośnik przed każdym znakiem na wejściu i to wszystko.
A oto, jak to wszystko wygląda, zanim sed
się 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
perl
lubpython
?