Dafür gibt es viele Tools:
ddist 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 tres 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 dumpoder mehrere andere Formate geben. Sie können alle Arten von Optionen angeben - aber ich mache nur ein Byte pro Zeile in einem \Cmaskierten 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 \newlines, \0nulls, \tabs und <spaces>gleichzeitig die Erhaltung der \CEscape - Sequenzen für das Trennzeichen. Beachten Sie die Hund xverwendeten Funktionen - jedes Mal , sedtrifft auf einen Begrenzer es , den Inhalt seiner Speicherpuffer auslagert. Auf diese Weise sedbleiben 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, sedwird es seine Eingaben weiterverarbeiten und odweiter 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, Cist dies ziemlich einfach - da sedbereits \\alle Backslash- printfZeichen für einzelne Eingaben durch einen doppelten Backslash maskiert wurden , hat die Ausführung von xargskeine 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 sedfügt einen \Backslash vor jedem Zeichen in die Eingabe ein, und das ist alles.
Und so sieht alles aus, bevor es jemals in den sedGriff 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
perloderpython?