Для этого есть много инструментов:
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, \0
нули, \t
абс и <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
escape-коды, это довольно просто - потому 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
?