Wie kann ich re-fügen Sie eine unicode-byte-order-marker in linux?
Ich habe eine ziemlich große SQL-Datei, die beginnt mit der byte order marker der FFFE. Ich teilte diese Datei mit der unicode aware linux-split-tool 100.000 line-Brocken. Aber wenn er diese zurück zu windows, tut es nicht wie jedes andere Teile als die erste, wie es nur hat der FFFE byte-Reihenfolge-Markierung auf.
Wie kann ich das hinzufügen dieser zwei-byte-code mit echo (oder einem anderen bash-Befehl)?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Etwas wie (backup-first)):
EF BB BF
(drei bytes). Dies würde nur funktionieren, wenn die Datei bereits im UTF-16, little-endian-Reihenfolge. Siehe en.wikipedia.org/wiki/...Basierend auf sed -Lösung von Anonym,
sed -i '1s/^/\xef\xbb\xbf/' foo
fügt die BOM UTF-8-codierten Dateifoo
. Nützlich ist auch, dass es konvertiert ASCII-Dateien nach UTF8 mit BOMHinzufügen von Stücklisten, die alle Dateien, die beginnen mit "foo", die Sie verwenden können
sed
.sed
hat eine option, ein backup zu machen.strace
ing dies zeigt, sed erstellt eine temporäre Datei mit einem Namen beginnend mit "sed". Wenn Sie wissen, für sicher, es ist keine Stückliste bereits, vereinfachen Sie den folgenden Befehl ein:Stellen Sie sicher, dass Sie benötigen, um UTF-16, weil also UTF-8 ist anders.
\xef\xbb\xbf
; für UTF-16 little-endian verwenden\xff\xfe
; für UTF-16 big-endian verwenden\xfe\xff
. Siehe w3.org/International/questions/qa-byte-order-mark-i,--inplace
option nicht angegeben wird von POSIX und wird nur mit GNU-sed.g
(global) Modifikator nicht hier nichts zu tun.Für eine Allgemeine Lösung—etwas, dass setzt die korrekte byte-order mark-unabhängig davon, ob die Datei in UTF-8, UTF-16 oder UTF-32—würde ich vim benutzen ist
'bomb'
option:(
-e
bedeutet runs in den ex-Modus statt des visuellen Modus;-s
bedeutet nicht, drucken Sie status-Nachrichten;-c
bedeutet "tun")Versuchen uconv
Matthew Flaschen, die Antwort ist gut, allerdings hat es ein paar Mängel.
ls
ist unnötig.Natürlich, Sie könnte sehr paranoid und überprüfen Sie für die Existenz der temporären Datei an den Anfang, so dass Sie nicht versehentlich überschreiben und/oder die Verwendung einer UUID oder eine generierte Datei name. Eine von mktemp, tempfile, oder uuidgen würde den trick tun.
Fallen könnte besser sein, als alle separaten Fehler-Handler, die ich Hinzugefügt habe.
Kein Zweifel, alle diese Vorsicht übertrieben ist, für ein one-shot script, aber diese Techniken können Sie sparen, wenn es hart auf hart kommt, vor allem in einem multi-Datei-Betrieb.
Dann überprüfen: