GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo detectar si un archivo tiene un BOM UTF-8 en Bash?

Primero, demostremos que head está funcionando correctamente:

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

Ahora, creemos una función funcional has_bom . Si tu grep admite -P , entonces una opción es:

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

Actualmente, solo GNU grep admite -P .

Otra opción es usar $'...' de bash :

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

ksh y zsh también admite $'...' pero esta construcción no es POSIX y dash no lo admite.

Notas:

  1. El uso de un return $? explícito es opcional. La función, de forma predeterminada, regresará con el código de salida de la última ejecución del comando.

  2. He usado el formulario POSIX para definir funciones. Esto es equivalente al formulario bash pero le da un problema menos con el que lidiar si alguna vez tiene que ejecutar la función bajo otro shell.

  3. bash acepta el uso del carácter - en un nombre de función, pero esta es una característica controvertida. Lo reemplacé con _ que es más ampliamente aceptado. (Para obtener más información sobre este tema, consulte esta respuesta).

  4. El -q opción a grep lo hace silencioso, lo que significa que aún establece un código de salida adecuado pero no envía ningún carácter a la salida estándar.


Apliqué lo siguiente para la primera línea de lectura:

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

Esto simplemente elimina la lista de materiales de la variable.


Linux
  1. ¿Cómo verificar si Bash tiene una vulnerabilidad de Shellshock?

  2. ¿Cómo quitar el Bom de un archivo Utf-8?

  3. ¿Cómo detectar Bash> =4.0?

  4. ¿Cómo se normaliza una ruta de archivo en Bash?

  5. Cómo grep una sección de un archivo en bash Shell

Cómo usar el comando de cabeza de Linux

Cómo verificar si existe un archivo o directorio en Bash

Cómo leer un archivo línea por línea en Bash

Cómo redirigir stderr a stdout en Bash

Cómo usar operadores de prueba de archivos Bash en Linux

Cómo verificar si existe un archivo o directorio en Bash Shell