Для цього існує багато інструментів:
ddце те, що ви хочете використовувати, якщо ви хочете заблокувати файл - надійно прочитайте лише певну кількість байтів лише певну кількість разів. Він портативно обробляє блокування та розблокування потоків файлів:
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
Я також використовую trвище, тому що він може обробляти перетворення будь-якого байта ASCII в будь-який інший (або, у цьому випадку, видалення будь-якого байта ASCII, який не є символом для друку, який не є пробілом). Це те, що я використав, відповідаючи на ваше інше питання сьогодні вранці, коли я це робив:
tr '>\n' '\n>' | sed 's/^>*//' | tr '\n>' '>\n'
Є багато подібних . Цей список повинен містити найменший підмножина спільного знаменника, з яким ви можете ознайомитися.
Але, якби я збирався робити обробку тексту на 2,5 гб двійкового файлу, я міг би почати з цього od. Він може надати вам octal dumpбудь-який або декілька інших форматів. Ви можете вказати всі види параметрів - але я буду робити лише один байт на рядок у \Cформаті, що уникнув:
Дані, які ви отримаєте, odбудуть регулярними в будь-який інтервал, який ви вказали - як я показую нижче. Але спочатку - ось відповідь на ваше запитання:
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}'
Це трохи вище \nвідмежування на ewlines, \0nulls, \tabs та <spaces>, зберігаючи пропущений \Cрядок для роздільника. Зауважте, що Hі xвикористовувані функції - кожен раз, коли sedвиникає роздільник, він міняє вміст своїх буферів пам'яті. Таким чином sedзберігається лише стільки інформації, скільки вона повинна надійно розмежувати файл, і не піддається перекриттю буфера - ні, тобто до тих пір, поки воно насправді стикається зі своїми роздільниками. До тих пір, поки це станеться, він sedбуде продовжувати обробляти свої дані та odпродовжуватиме надавати їх, поки не зіткнеться EOF.
Як результат, його вихід виглядає приблизно так:
first
\nnewline
\ttab
spacefoobar
\0null
Тож якщо я хочу foobar:
printf ... | od ... | sed ... |
sed 's/foobar/\
&\
/g'
###OUTPUT###
first
\nnewline
\ttab
space
foobar
\0null
Тепер, якщо ви хочете скористатися втечею, Cце досить просто - адже sedвже подвійний \\зворотний printfнахил уникнув усіх своїх вхідних косої риски, тож у виконанні xargsне виникне жодних проблем, пов'язаних із виробництвом результатів у вашій специфікації. Але xargs їсть цитати оболонок, тож вам потрібно буде ще раз подвоїти це:
printf 'nl\ntab\tspace foobarfoobar\0null' |
PIPELINE |
sed 's/./\\&/g' |
xargs printf %b |
cat -A
###OUTPUT###
nl$
tab^Ispace $
foobar$
$
foobar$
^@null%
Це можна було б легко зберегти до змінної оболонки та вивести пізніше однаково. Останній sedвставляє \зворотну косу рису перед кожним символом у своєму введенні, і це все.
А ось як це все виглядає, перш ніж коли-небудь sedздобути це:
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чиpython?