Il existe de nombreux outils pour cela:
dd
est ce que vous voulez utiliser si vous voulez bloquer un fichier - ne lisez de manière fiable qu'un certain nombre d'octets qu'un certain nombre de fois. Il gère de manière portative le blocage et le déblocage des flux de fichiers:
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
J'utilise également tr
ci-dessus car il peut gérer la conversion de tout octet ASCII en un autre (ou, dans ce cas, la suppression de tout octet ASCII qui n'est pas un caractère imprimable sans espace). C'est ce que j'ai utilisé en réponse à votre autre question ce matin, en fait, quand j'ai fait:
tr '>\n' '\n>' | sed 's/^>*//' | tr '\n>' '>\n'
Il en existe de nombreux similaires . Cette liste devrait fournir un sous-ensemble de dénominateurs communs le plus bas avec lequel vous pourriez vous familiariser.
Mais, si je devais faire du traitement de texte sur 2,5 Go de fichier binaire, je pourrais commencer par od
. Il peut vous donner un octal dump
ou plusieurs autres formats. Vous pouvez spécifier toutes sortes d'options - mais je ne ferai qu'un octet par ligne dans un \C
format d'échappement:
Les données que vous obtiendrez od
seront régulières à n'importe quel intervalle que vous spécifiez - comme je le montre ci-dessous. Mais d'abord - voici une réponse à votre question:
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}'
Ce petit peu au- dessus sur délimite \n
ewlines, \0
nulls, \t
abs et <spaces>
tout en préservant la \C
chaîne échappée pour le delimiter. Notez les fonctions H
et x
utilisées - à chaque fois qu'il sed
rencontre un délimiteur, il échange le contenu de ses tampons de mémoire. De cette façon, sed
ne conserve que les informations nécessaires pour délimiter le fichier de manière fiable et ne succombe pas aux dépassements de tampon - ce n'est pas le cas, tant qu'il rencontre réellement ses délimiteurs. Tant qu'il le fera, sed
continuera à traiter son entrée et od
continuera à la fournir jusqu'à ce qu'elle rencontre EOF
.
En l'état, sa sortie ressemble à ceci:
first
\nnewline
\ttab
spacefoobar
\0null
Donc si je veux foobar
:
printf ... | od ... | sed ... |
sed 's/foobar/\
&\
/g'
###OUTPUT###
first
\nnewline
\ttab
space
foobar
\0null
Maintenant, si vous voulez utiliser les C
échappements, c'est assez facile - car la sed
double \\
barre oblique inversée a déjà échappé à toutes ses barres obliques inverses, donc printf
exécutée depuis xargs
n'aura aucun problème à produire la sortie selon vos spécifications. Mais xargs
mange des guillemets shell , vous devrez donc le répéter:
printf 'nl\ntab\tspace foobarfoobar\0null' |
PIPELINE |
sed 's/./\\&/g' |
xargs printf %b |
cat -A
###OUTPUT###
nl$
tab^Ispace $
foobar$
$
foobar$
^@null%
Cela aurait pu tout aussi bien être enregistré dans une variable shell et sorti plus tard de la même manière. Le dernier sed
insère une \
barre oblique inverse avant chaque caractère dans son entrée, et c'est tout.
Et voici à quoi tout cela ressemble avant de sed
s'en emparer:
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
?