Existem muitas ferramentas para isso:
dd
é o que você deseja usar se desejar bloquear um arquivo - leia com confiabilidade apenas um certo número de bytes apenas um certo número de vezes. Ele lida de maneira portável com o bloqueio e desbloqueio de fluxos de arquivos:
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
Eu também uso tr
acima porque ele pode manipular a conversão de qualquer byte ASCII para qualquer outro (ou, nesse caso, excluir qualquer byte ASCII que não seja um caractere imprimível que não seja espaço). É o que eu usei em resposta à sua outra pergunta esta manhã, de fato, quando eu fiz:
tr '>\n' '\n>' | sed 's/^>*//' | tr '\n>' '>\n'
Existem muitos similares . Essa lista deve fornecer um subconjunto de denominador comum mais baixo com o qual você possa se familiarizar.
Mas, se eu fosse fazer o processamento de texto em 2,5 gbs de arquivo binário, eu poderia começar od
. Pode fornecer a você um octal dump
ou vários outros formatos. Você pode especificar todos os tipos de opções - mas vou fazer um byte por linha em um \C
formato de escape:
Os dados que você obterá od
serão regulares no intervalo que você especificar - como mostramos abaixo. Mas primeiro - aqui está uma resposta para sua pergunta:
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}'
Esse pouco acima delimita \n
linhas ew, \0
nulos, \t
abs e <spaces>
preserva a \C
string de escape para o delimitador. Observe as funções H
e x
usadas - sempre que sed
encontra um delimitador, ele troca o conteúdo de seus buffers de memória. Dessa maneira, sed
apenas retém o máximo de informações necessárias para delimitar o arquivo com segurança e não sucumbe às excedências de buffer - não é, desde que encontre seus delimitadores. Enquanto isso, sed
continuará processando sua entrada e od
continuará fornecendo-a até encontrar EOF
.
Como é, sua saída é assim:
first
\nnewline
\ttab
spacefoobar
\0null
Então, se eu quiser foobar
:
printf ... | od ... | sed ... |
sed 's/foobar/\
&\
/g'
###OUTPUT###
first
\nnewline
\ttab
space
foobar
\0null
Agora, se você quiser usar os C
escapes, é muito fácil - porque a barra invertida sed
dupla já \\
escapou de todas as barras invertidas de entrada única, portanto, a printf
execução de xargs
não terá problemas para produzir a saída conforme sua especificação. Mas como xargs
aspas shell, você precisará citá-las novamente:
printf 'nl\ntab\tspace foobarfoobar\0null' |
PIPELINE |
sed 's/./\\&/g' |
xargs printf %b |
cat -A
###OUTPUT###
nl$
tab^Ispace $
foobar$
$
foobar$
^@null%
Isso poderia ter sido facilmente salvo em uma variável do shell e produzido posteriormente de maneira idêntica. O último sed
insere uma \
barra invertida antes de cada caractere em sua entrada, e isso é tudo.
E aqui está o que tudo parece antes de sed
se apossar:
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
oupython
?