Mit awk die Byte-Reihenfolge-Marke entfernen
-
21-08-2019 - |
Frage
Wie wäre ein awk
Skript (vermutlich ein Einzeiler) für einen BOM aussehen ?
Spezifikation:
- Drucken jeder Zeile nach der ersten (
NR > 1
) - für die erste Zeile: Wenn es mit
#FE #FF
oder#FF #FE
beginnt, entfernen Sie diese und drucken den Rest
Lösung
Versuchen Sie folgendes:
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}{print}' INFILE > OUTFILE
Auf dem ersten Datensatz (Zeile), die BOM-Zeichen entfernen. Drucke jeden Datensatz.
oder etwas kürzer, mit dem Wissen, dass die Standard-Aktion in awk ist, den Datensatz drucken:
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1' INFILE > OUTFILE
1
ist der kürzeste Bedingung, die immer den Wert true, so dass jeder Datensatz gedruckt wird.
Genießen Sie!
- NACHTRAG -
Unicode Byte Order Mark (BOM) FAQ Die folgende Tabelle enthält die genaue BOM listing Bytes für jede Codierung:
Bytes | Encoding Form
--------------------------------------
00 00 FE FF | UTF-32, big-endian
FF FE 00 00 | UTF-32, little-endian
FE FF | UTF-16, big-endian
FF FE | UTF-16, little-endian
EF BB BF | UTF-8
So können Sie sehen, wie \xef\xbb\xbf
EF BB BF
UTF-8
entspricht BOM aus der obigen Tabelle Bytes.
Andere Tipps
Mit GNU sed
(unter Linux oder Cygwin):
# Removing BOM from all text files in current directory:
sed -i '1 s/^\xef\xbb\xbf//' *.txt
Unter FreeBSD:
sed -i .bak '1 s/^\xef\xbb\xbf//' *.txt
Vorteil der Verwendung von GNU oder FreeBSD sed
: die -i
Parameter bedeutet "in place", und werden die Dateien aktualisiert werden, ohne die Notwendigkeit für Umleitungen oder seltsame Tricks
Auf dem Mac:
Diese awk
Lösung in einer anderen Antwort funktioniert , aber der sed
Befehl oben funktioniert nicht. Zumindest auf dem Mac (Sierra) sed
Dokumentation erwähnt nicht hexadezimal unterstützt ala \xef
entkommen.
Ein ähnlicher Trick kann mit jedem Programm durch Rohrleitungen zum sponge
Tool von moreutils erreicht werden:
awk '…' INFILE | sponge INFILE
Nicht awk, aber einfacher:
tail -c +4 UTF8 > UTF8.nobom
für BOM Um zu überprüfen:
hd -n 3 UTF8
Wenn BOM vorhanden ist, werden Sie sehen: 00000000 ef bb bf ...
Neben CRLF Zeilenende LF Konvertierung dos2unix
entfernt auch Stücklisten:
dos2unix *.txt
dos2unix
wandelt auch UTF-16-Dateien mit einer BOM (aber nicht UTF-16-Dateien ohne BOM) auf UTF-8 ohne BOM:
$ printf '\ufeffä\n'|iconv -f utf-8 -t utf-16be>bom-utf16be
$ printf '\ufeffä\n'|iconv -f utf-8 -t utf-16le>bom-utf16le
$ printf '\ufeffä\n'>bom-utf8
$ printf 'ä\n'|iconv -f utf-8 -t utf-16be>utf16be
$ printf 'ä\n'|iconv -f utf-8 -t utf-16le>utf16le
$ printf 'ä\n'>utf8
$ for f in *;do printf '%11s %s\n' $f $(xxd -p $f);done
bom-utf16be feff00e4000a
bom-utf16le fffee4000a00
bom-utf8 efbbbfc3a40a
utf16be 00e4000a
utf16le e4000a00
utf8 c3a40a
$ dos2unix -q *
$ for f in *;do printf '%11s %s\n' $f $(xxd -p $f);done
bom-utf16be c3a40a
bom-utf16le c3a40a
bom-utf8 c3a40a
utf16be 00e4000a
utf16le e4000a00
utf8 c3a40a
Ich weiß, die Frage auf Unix / Linux gerichtet war, dachte, es würde sich lohnen eine gute Option für die Unix-herausgefordert zu erwähnen (auf Fenster, mit einem UI).
Ich lief in das gleiche Problem auf einem Wordpress-Projekt (BOM wurde Probleme mit RSS-Feed und die Seitenvalidierung verursacht) und ich musste alle Dateien in einem ziemlich großen Verzeichnisbaum Blick in dem finden, die mit BOM war. Gefunden eine Anwendung namens Ersetzen Pioneer und in ihm:
Batch Runner -> Suche (um alle Dateien in den Unterordnern zu finden) -> Vorlage ersetzen -> Binary BOM entfernen (es gibt eine fertige Suche und ersetzen Vorlage für diese).
Es war nicht die eleganteste Lösung, und es bedurfte der Installation eines Programms, das ein Nachteil ist. Aber sobald ich herausgefunden, was um mich herum vorging, es funktionierte wie ein Charme (und gefunden 3 Dateien aus etwa 2300, die mit BOM waren).