Shell-Skript / Dienstprogramm ersetzen 2-Byte-Unicode in der Binärdatei

7

Ich habe viele große Unicode-Dateien. Ich möchte jedes Unicode-Bytepaar durch ein neues Unicode-Bytepaar ersetzen. Zum Beispiel enthält die Originaldatei "C3 B9 C3 AB C3 B8 C3 B0" und ich möchte diese durch "D7 A0 D7 A8 D7 9B D7 A9" ersetzen. Ich müsste jedes "C3 B9" durch "D7 A0" in der gesamten Datei ersetzen. Es werden ungefähr 30 verschiedene "C3 XX" -Werte durch "D7 YY" -Werte ersetzt. Ich würde für jeden Ersatz eine Tabelle zum Durchlaufen benötigen.

Im Idealfall würde dies die Originaldatei ersetzen, es kann jedoch auch eine neue Ausgabedatei erstellt werden.

Gibt es ein Dienstprogramm unter Ubuntu, das diesen Job erledigt?

leonow
quelle
Ich kann nicht direkt helfen, aber die Leute berichten, dass sie Python verwenden, das Unicode für solche Dinge handhabt.
EightBitTony
1
Ist dieser Unicode als UTF-8 codiert (z. B. ist C3B9 U + 00F9 LATEINISCHER KLEINBUCHSTABE U MIT GRAB (ù))? Oder als UCS-2 (also zB C3B9 ist HANGUL SYLLABLE SSYEOT)?
Gilles 'SO - hör auf böse zu sein'

Antworten:

3

Das ist mit Perl möglich,

Eine Beispieldatei:

echo -e "\xe8\x90" > a

Und jetzt, wenn Sie es tun:

perl -pne 's/\xe8\x90/\x41\x42/g' < a > output

Sie bekommen 0x41 0x42, was istAB

Gänseblümchen
quelle
Wie mache ich es über Linien hinweg? Ich versuche, nicht mehr als eine neue Zeile nach a durchzusetzen {, also habe ich es versucht perl -pne "s/\x7b\x0a\x0a/\x7b\x0a/g" < a > outputund es funktioniert nicht. Ich habe getestet, dass perl -pne "s/\x7b\x0a/\x7b/g" < a > outputdas \x0aZeilenumbruchzeichen entfernt wird, aber es tut dies, wo es nicht sollte, und ich möchte, dass es das nachfolgende Zeichen nur entfernt \x0a, wenn es eine Sequenz von\x7b\x0a\x0a
Aaron Franke
2

Eine Alternative zum Perl-Aufruf ist die Verwendung von sed

sed -i.bckp -e "s/\xc3\xb9/\xd7\xa0/" file

Mit dem Stream-Editor (sed) wird die Inplace-Ausführung ausgeführt (was bedeutet, dass die Datei sofort geändert wird), und ich habe .bckp als Argument für -i angegeben, damit die alte Datei gesichert wird. Dann führe ich einen Swap-Ausdruck aus, der mit Regex nach Ihren Hex-Bytes sucht und diese mit den Bytes austauscht, die Sie verwenden möchten. Und der Aufruf zur Datei ist die große Datei, mit der Sie dies tun möchten.

Wenn Sie das Inplace ersetzen möchten, ohne es zu sichern (z. B. befindet sich die Datei in einem Repo), können Sie die .bckp-Datei einfach nach dem -i entfernen und es werden keine neuen Dateien erstellt.

sparticvs
quelle
Wie sedändere ich Zeilenumbrüche ( \x0a)? Der Befehl sed -i -e "s/\x0a//g" filemacht nichts. Wenn ich buchstäblich ein anderes Zeichen verwende \x0a, funktioniert es einwandfrei.
Aaron Franke
Versuchen Sie stattdessen "s / \ n // g" (siehe Abschnitt "Reg-Ausdruck" in der Manpage). Wenn dies nicht funktioniert, bestätigen Sie den Hex-Wert (je nach Betriebssystem kann es sich um einen Wagenrücklauf anstelle eines Zeilenumbruchs handeln) in der Datei.
sparticvs
Ich habe herausgefunden, dass die Lösung zu verwenden ist sed -z, da dies dazu führt sed, dass Zeilen durch Nullzeichen anstelle von Zeilenumbrüchen begrenzt werden, sodass die gesamte Datei als eine massive Zeile behandelt wird und ich daher sedZeilenumbrüche bearbeiten kann.
Aaron Franke