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?
text-processing
replace
unicode
leonow
quelle
quelle
Antworten:
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
quelle
{
, also habe ich es versuchtperl -pne "s/\x7b\x0a\x0a/\x7b\x0a/g" < a > output
und es funktioniert nicht. Ich habe getestet, dassperl -pne "s/\x7b\x0a/\x7b/g" < a > output
das\x0a
Zeilenumbruchzeichen 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
Eine Alternative zum Perl-Aufruf ist die Verwendung von sed
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.
quelle
sed
ändere ich Zeilenumbrüche (\x0a
)? Der Befehlsed -i -e "s/\x0a//g" file
macht nichts. Wenn ich buchstäblich ein anderes Zeichen verwende\x0a
, funktioniert es einwandfrei.sed -z
, da dies dazu führtsed
, dass Zeilen durch Nullzeichen anstelle von Zeilenumbrüchen begrenzt werden, sodass die gesamte Datei als eine massive Zeile behandelt wird und ich dahersed
Zeilenumbrüche bearbeiten kann.