GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann man in Bash erkennen, ob eine Datei eine UTF-8-BOM hat?

Lassen Sie uns zuerst diesen head demonstrieren funktioniert eigentlich richtig:

$ printf '\xef\xbb\xbf' >file
$ head -c 3 file 
$ head -c 3 file | hexdump -C
00000000  ef bb bf                                          |...|
00000003

Lassen Sie uns nun eine funktionierende Funktion has_bom erstellen . Wenn Ihr grep unterstützt -P , dann ist eine Option:

$ has_bom() { head -c3 "$1" | LC_ALL=C grep -qP '\xef\xbb\xbf'; }
$ has_bom file && echo yes
yes

Derzeit nur GNU grep unterstützt -P .

Eine weitere Option ist die Verwendung von $'...' von bash :

$ has_bom() { head -c3 "$1" | grep -q $'\xef\xbb\xbf'; }
$ has_bom file && echo yes
yes

ksh und zsh unterstützt auch $'...' aber dieses Konstrukt ist nicht POSIX und dash unterstützt es nicht.

Hinweise:

  1. Die Verwendung eines expliziten return $? es ist optional. Die Funktion kehrt standardmäßig mit dem Exit-Code der letzten Befehlsausführung zurück.

  2. Ich habe das POSIX-Formular zum Definieren von Funktionen verwendet. Dies entspricht dem Bash-Formular, gibt Ihnen aber ein Problem weniger, mit dem Sie sich auseinandersetzen müssen, wenn Sie die Funktion jemals unter einer anderen Shell ausführen müssen.

  3. bash akzeptiert die Verwendung des Zeichens - in einem Funktionsnamen, aber dies ist ein umstrittenes Merkmal. Ich habe es durch _ ersetzt was mehr akzeptiert wird. (Weitere Informationen zu diesem Thema finden Sie in dieser Antwort.)

  4. Die -q Option zu grep macht es leise, was bedeutet, dass es immer noch einen richtigen Exit-Code setzt, aber es sendet keine Zeichen an stdout.


Für die erste Lesezeile habe ich Folgendes angewendet:

read c
if (( "$(printf "%d" "'${c:0:1}")" == 65279 ))  ; then c="${c:1}" ; fi

Dadurch wird einfach die Stückliste aus der Variablen entfernt.


Linux
  1. So konvertieren Sie Dateien in UTF-8-Codierung unter Linux

  2. Wie entferne ich die Bom aus einer UTF-8-Datei?

  3. Wie erkennt man Bash>=4.0?

  4. Wie parse ich eine CSV-Datei in Bash?

  5. Wie rekodiere ich bedingt in UTF-8?

So verwenden Sie den Linux-Kopfbefehl

So überprüfen Sie, ob eine Datei oder ein Verzeichnis in Bash vorhanden ist

So lesen Sie eine Datei Zeile für Zeile in Bash

So leiten Sie stderr in Bash auf stdout um

So verwenden Sie Bash-Dateitestoperatoren in Linux

So überprüfen Sie, ob eine Datei oder ein Verzeichnis in der Bash-Shell vorhanden ist