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
War es hilfreich?

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).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top