Ich habe eine Datei in UTF-8-Codierung mit Stückliste und möchte die Stückliste entfernen. Gibt es Linux-Befehlszeilentools, um die Stückliste aus der Datei zu entfernen?
$ file test.xml
test.xml: XML 1.0 document, UTF-8 Unicode (with BOM) text, with very long lines
command-line
files
unicode
m13r
quelle
quelle
Antworten:
Wenn Sie nicht sicher sind, ob die Datei eine UTF-8-Stückliste enthält, wird diese Stückliste (unter der Annahme der GNU-Implementierung von
sed
) entfernt, falls vorhanden, oder es werden keine Änderungen vorgenommen, falls dies nicht der Fall ist.Sie können die vorhandene Datei auch mit der folgenden
-i
Option überschreiben :quelle
en_US.UTF-8
Gebietsschema getestet und es hat funktioniert. Wann wird es scheitern?1s/
bedeutet , dass nur die erste Zeile durchsucht wird. andere Zeilen bleiben davon unberührt. Die^
Mittel stimmen nur am Anfang der (ersten) Zeile überein.\xEF\xBB\xBF
ist die UTF-8-Stückliste (Escape-Hex-Zeichenfolge).//
bedeutet durch nichts ersetzen. Ich hätte1
am Ende (für1s/^xEF\xBB\xBF//1
) hinzufügen können , was bedeutet, dass nur das erste Vorkommen des Musters in der Zeile übereinstimmt. Da die Suche jedoch verankert ist^
, macht dies keinen Unterschied. Wenn die Datei am Anfang der ersten Zeile keine Stückliste enthält, stimmt das Muster nicht überein und es werden keine Änderungen vorgenommen.Eine Stückliste ist in UTF-8 nicht sinnvoll. Diese werden in der Regel versehentlich durch falsche Software unter Microsoft-Betriebssystemen hinzugefügt.
dos2unix
entfernt es und kümmert sich auch um andere Besonderheiten von Windows-Textdateien.quelle
dos2unix
?Es ist möglich, die Stückliste mit dem folgenden
tail
Befehl aus einer Datei zu entfernen :quelle
tail
verwendet 1-basierte Indizierung ?! WTF!tail -c -1
odertail -c 1
(wastail
allgemein verwendet wird) ist der Inhalt, der mit dem letzten Bytetail -c +1
beginnt und mit dem ersten Byte beginnt.tail -c 0
/tail -c +0
denn das wäre viel uninteressanter.(dd bs=1 count=3 of=/dev/null; cat) <input >output
. Oder mit GNU(head -c3 >/dev/null; cat)
- sogar in UTF8 oder einem anderen Gebietsschema ohne Einzelbyte; GNU-Kopf bedeutet 'char' = Byte.Verwenden von VIM
Datei in VIM öffnen:
Stücklistencodierung entfernen:
Speichern und Beenden:
quelle
<feff>
, sie:set nobomb
jedoch nicht ändert oder entfernt.Sie können verwenden
Entfernen der Markierung für die Bytereihenfolge vom Anfang der Datei, falls vorhanden, sowie Konvertieren von CR-LF-Zeilenumbrüchen in LF-Zeilenumbrüche. Das
LANG=C LC_ALL=C
teilt der Shell mit, dass der Befehl im Standardgebietsschema C (auch als Standard-POSIX-Gebietsschema bezeichnet) ausgeführt werden soll. Dabei werden die drei Bytes, die die Byte-Ordnungsmarke bilden, als Bytes behandelt. Die-i
Option zu sed bedeutet vor Ort. Wenn Sie verwenden-i.old
, speichert sed die Originaldatei alsfilename.old
und die neue Datei (mit den Änderungen, falls vorhanden) alsfilename
.Ich persönlich habe das gerne als
~/bin/fix-ms
; zum Beispiel alsWenn ich dies anwenden muss, um alle C-Quelldateien und -Header (z. B. meinen alten Code aus der MS-DOS-Ära) auszudrücken, führe ich einfach aus
oder, wenn ich nur eine solche Datei anschauen möchte, ohne sie zu ändern, kann ich sie ausführen
und nicht das hässliche
<U+FEFF>
in meinem UTF-8-Terminal sehen.quelle
sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- "$@"
?sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- "$@"
nicht funktioniert. Es gibt zwar einen Exit-Code zurück, verarbeitet jedoch vor dem Beenden alle in der Argumentliste aufgeführten Dateien.--
Voranstellen der Dateinamen ist natürlich wichtig: Ohne diese Angabe können Dateinamen, die mit einem Bindestrich beginnen, von sed als Optionen angesehen werden. Ich habe diese in meine Antwort eingearbeitet. Danke für die Erinnerung!Kürzlich habe ich dieses winzige Befehlszeilen-Tool gefunden, das die Stückliste für beliebige UTF-8-kodierte Dateien hinzufügt oder entfernt: UTF BOM Utils ( neuer Link bei github)
Kleiner Nachteil, Sie können nur den einfachen C ++ - Quellcode herunterladen. Sie müssen das Makefile erstellen ( zum Beispiel mit CMake ) und es selbst kompilieren, Binärdateien werden auf dieser Seite nicht bereitgestellt.
quelle