Dafür gibt es viele Tools:
dd
ist das, was Sie verwenden möchten, wenn Sie eine Datei blockieren möchten - zuverlässig nur eine bestimmte Anzahl von Bytes nur eine bestimmte Anzahl von Malen lesen. Es handhabt portabel das Blockieren und Entsperren von Dateistreams:
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
Ich benutze tr
es auch oben, weil es das Konvertieren eines beliebigen ASCII-Bytes in ein beliebiges anderes (oder in diesem Fall das Löschen eines beliebigen ASCII-Bytes, das kein druckbares Zeichen ohne Leerzeichen ist) handhaben kann. Das habe ich heute Morgen bei der Beantwortung Ihrer anderen Frage verwendet, als ich Folgendes getan habe:
tr '>\n' '\n>' | sed 's/^>*//' | tr '\n>' '>\n'
Es gibt viele ähnliche . Diese Liste sollte eine Teilmenge mit dem kleinsten gemeinsamen Nenner enthalten, mit der Sie möglicherweise vertraut sind.
Aber wenn ich eine Textverarbeitung mit 2,5 GB Binärdatei durchführen würde, könnte ich damit beginnen od
. Es kann Ihnen ein octal dump
oder mehrere andere Formate geben. Sie können alle Arten von Optionen angeben - aber ich mache nur ein Byte pro Zeile in einem \C
maskierten Format:
Die Daten, die Sie von erhalten od
, werden regelmäßig in einem von Ihnen festgelegten Intervall abgerufen - wie ich unten zeige. Aber zuerst - hier ist eine Antwort auf Ihre Frage:
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}'
Das etwas über Delimitis auf \n
ewlines, \0
nulls, \t
abs und <spaces>
gleichzeitig die Erhaltung der \C
Escape - Sequenzen für das Trennzeichen. Beachten Sie die H
und x
verwendeten Funktionen - jedes Mal , sed
trifft auf einen Begrenzer es , den Inhalt seiner Speicherpuffer auslagert. Auf diese Weise sed
bleiben nur so viele Informationen erhalten, wie für eine zuverlässige Abgrenzung der Datei erforderlich sind, und es kommt nicht zu Pufferüberläufen. Solange es das tut, sed
wird es seine Eingaben weiterverarbeiten und od
weiter zur Verfügung stellen, bis es auf sie trifft EOF
.
Die Ausgabe sieht wie folgt aus:
first
\nnewline
\ttab
spacefoobar
\0null
Also wenn ich will foobar
:
printf ... | od ... | sed ... |
sed 's/foobar/\
&\
/g'
###OUTPUT###
first
\nnewline
\ttab
space
foobar
\0null
Wenn Sie nun die Escape-Zeichen verwenden möchten, C
ist dies ziemlich einfach - da sed
bereits \\
alle Backslash- printf
Zeichen für einzelne Eingaben durch einen doppelten Backslash maskiert wurden , hat die Ausführung von xargs
keine Probleme, die Ausgabe gemäß Ihrer Spezifikation zu erstellen . Es werden jedoch xargs
Shell-Anführungszeichen verwendet, sodass Sie es erneut in doppelte Anführungszeichen setzen müssen:
printf 'nl\ntab\tspace foobarfoobar\0null' |
PIPELINE |
sed 's/./\\&/g' |
xargs printf %b |
cat -A
###OUTPUT###
nl$
tab^Ispace $
foobar$
$
foobar$
^@null%
Das hätte genauso einfach in einer Shell-Variablen gespeichert und später auf identische Weise ausgegeben werden können. Der letzte sed
fügt einen \
Backslash vor jedem Zeichen in die Eingabe ein, und das ist alles.
Und so sieht alles aus, bevor es jemals in den sed
Griff kommt:
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
oderpython
?