Hay muchas herramientas para esto:
ddes lo que desea usar si desea bloquear un archivo: lea de manera confiable solo un cierto número de bytes solo un cierto número de veces. Maneja de forma portátil el bloqueo y desbloqueo de secuencias de archivos:
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
También lo uso trarriba porque puede manejar la conversión de cualquier byte ASCII a cualquier otro (o, en este caso, eliminar cualquier byte ASCII que no sea un carácter imprimible sin espacio). Es lo que usé en respuesta a su otra pregunta esta mañana, de hecho, cuando lo hice:
tr '>\n' '\n>' | sed 's/^>*//' | tr '\n>' '>\n'
Hay muchos parecidos . Esa lista debe proporcionar un subconjunto de denominador común más bajo con el que pueda familiarizarse.
Pero, si fuera a hacer procesamiento de texto en 2.5 gbs de archivo binario, podría comenzar con od. Puede darle uno octal dumpo cualquiera de varios otros formatos. Puede especificar todo tipo de opciones, pero solo haré un byte por línea en un \Cformato de escape:
Los datos que obtendrá odserán regulares en cualquier intervalo que especifique, como se muestra a continuación. Pero primero, aquí hay una respuesta a su pregunta:
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}'
Ese poco más arriba delimita en \nlíneas de tensión, \0nulos, \tabdominales y al <spaces>tiempo que conserva la \Ccadena de escape para el delimitador. Tenga en cuenta las funciones Hy xutilizadas: cada vez que sedencuentra un delimitador, intercambia el contenido de sus memorias intermedias. De esta manera, sedsolo retiene tanta información como debe para delimitar de manera confiable el archivo y no sucumbe a desbordamientos de búfer, es decir, no, siempre y cuando realmente encuentre sus delimitadores. Mientras lo haga, sedcontinuará procesando su entrada y odcontinuará proporcionándola hasta que se encuentre EOF.
Como es, su salida se ve así:
first
\nnewline
\ttab
spacefoobar
\0null
Entonces si quiero foobar:
printf ... | od ... | sed ... |
sed 's/foobar/\
&\
/g'
###OUTPUT###
first
\nnewline
\ttab
space
foobar
\0null
Ahora, si desea hacer uso de los Cescapes, es bastante fácil, sedya que la \\barra invertida doble escapó de todas sus barras invertidas de entrada individuales, por lo que si se printfejecuta desde allí xargsno tendrá problemas para producir el resultado según sus especificaciones. Pero xargs come comillas, así que tendrás que volver a comillas dobles:
printf 'nl\ntab\tspace foobarfoobar\0null' |
PIPELINE |
sed 's/./\\&/g' |
xargs printf %b |
cat -A
###OUTPUT###
nl$
tab^Ispace $
foobar$
$
foobar$
^@null%
Eso podría haberse guardado tan fácilmente en una variable de shell y salir más tarde de manera idéntica. El último sedinserta una \barra diagonal inversa antes de cada carácter en su entrada, y eso es todo.
Y así es como se ve todo antes de que lo sedalcance:
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
perlopython?