Ci sono molti strumenti per questo:
dd
è ciò che si desidera utilizzare se si desidera bloccare un file: leggere in modo affidabile solo un determinato numero di byte solo un determinato numero di volte. Gestisce in modo portabile il blocco e lo sblocco dei flussi di file:
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
Uso anche tr
sopra perché può gestire la conversione di qualsiasi byte ASCII in qualsiasi altro (o, in questo caso, l'eliminazione di qualsiasi byte ASCII che non sia un carattere stampabile non spaziale). È quello che ho usato in risposta alla tua altra domanda questa mattina, infatti, quando ho fatto:
tr '>\n' '\n>' | sed 's/^>*//' | tr '\n>' '>\n'
Ce ne sono molti simili . Tale elenco dovrebbe fornire un sottoinsieme del minimo comune denominatore con il quale è possibile acquisire familiarità.
Ma, se avessi intenzione di eseguire l'elaborazione del testo su 2,5 gbs di file binario, potrei iniziare con od
. Può darti uno octal dump
o uno dei tanti altri formati. Puoi specificare tutti i tipi di opzioni, ma farò solo un byte per riga in un \C
formato con escape:
I dati che riceverai od
saranno regolari a qualunque intervallo tu specifichi, come mostrerò di seguito. Ma prima: ecco una risposta alla tua domanda:
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}'
Quel po 'sopra delimita su \n
ewline, \0
null, \t
abs e <spaces>
preservando la \C
stringa di escape per il delimitatore. Nota le funzioni H
e x
utilizzate: ogni volta che sed
incontra un delimitatore scambia il contenuto dei suoi buffer di memoria. In questo modo sed
conserva solo tutte le informazioni necessarie per delimitare in modo affidabile il file e non soccombe ai sovraccarichi del buffer - non, cioè fino a quando incontra effettivamente i suoi delimitatori. Per tutto il tempo, sed
continuerà a elaborare il suo input e od
continuerà a fornirlo fino a quando non si incontrerà EOF
.
Così com'è, il suo output è simile al seguente:
first
\nnewline
\ttab
spacefoobar
\0null
Quindi se voglio foobar
:
printf ... | od ... | sed ... |
sed 's/foobar/\
&\
/g'
###OUTPUT###
first
\nnewline
\ttab
space
foobar
\0null
Ora, se si desidera utilizzare le escape C
, è abbastanza facile - perché sed
ha già una doppia \\
barra rovesciata è sfuggita a tutte le singole barre rovesciate dell'input, quindi printf
eseguita da xargs
non avrà problemi a produrre l'output secondo le vostre specifiche. Ma xargs
mangia le virgolette della shell, quindi dovrai raddoppiarla di nuovo:
printf 'nl\ntab\tspace foobarfoobar\0null' |
PIPELINE |
sed 's/./\\&/g' |
xargs printf %b |
cat -A
###OUTPUT###
nl$
tab^Ispace $
foobar$
$
foobar$
^@null%
Ciò avrebbe potuto essere facilmente salvato in una variabile di shell e successivamente prodotto in modo identico. L'ultimo sed
inserisce una \
barra rovesciata prima di ogni carattere nel suo input, e questo è tutto.
Ed ecco come appare tutto prima che mai se ne sed
accorga:
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
opython
?