GNU/Linux >> Znalost Linux >  >> Linux

Jak zjistit, zda má soubor v Bash kusovník UTF-8?

Nejprve si ukažme, že head ve skutečnosti funguje správně:

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

Nyní vytvoříme funkční funkci has_bom . Pokud je vaše grep podporuje -P , pak jedna možnost je:

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

V současné době pouze GNU grep podporuje -P .

Další možností je použít bash $'...' :

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

ksh a zsh také podporuje $'...' ale tento konstrukt není POSIX a dash to nepodporuje.

Poznámky:

  1. Použití explicitního return $? je volitelný. Funkce se standardně vrátí s návratovým kódem posledního spuštění příkazu.

  2. Pro definování funkcí jsem použil formulář POSIX. To je ekvivalentní s bash formou, ale dává vám to o jeden problém méně, pokud byste někdy museli spouštět funkci pod jiným shellem.

  3. bash akceptuje použití znaku - v názvu funkce, ale to je kontroverzní funkce. Nahradil jsem ho _ který je více akceptován. (Další informace o tomto problému naleznete v této odpovědi.)

  4. -q možnost na grep ztiší jej, což znamená, že stále nastavuje správný výstupní kód, ale neposílá žádné znaky do stdout.


Pro první přečtený řádek jsem použil následující:

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

To jednoduše odstraní kusovník z proměnné.


Linux
  1. Jak převést soubory do kódování UTF-8 v Linuxu

  2. Jak analyzovat soubor CSV v Bash?

  3. Jak zkontrolovat syslog v Bash na Linuxu?

  1. Jak zkontrolovat, zda má Bash zranitelnost Shellshock?

  2. Jak zkontrolovat, zda je soubor prázdný v Bash?

  3. Jak podmíněně překódovat do UTF-8?

  1. Je možné zjistit, kdy byl soubor stažen?

  2. Jak zjistit Bash>=4.0?

  3. Jak normalizujete cestu k souboru v Bash?