GNU/Linux >> Tutoriels Linux >  >> Linux

Comment détecter si un fichier a une nomenclature UTF-8 dans Bash ?

Tout d'abord, démontrons que head fonctionne correctement :

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

Maintenant, créons une fonction fonctionnelle has_bom . Si votre grep supporte -P , alors une option est :

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

Actuellement, seul GNU grep supporte -P .

Une autre option consiste à utiliser le $'...' de bash :

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

ksh et zsh prend également en charge $'...' mais cette construction n'est pas POSIX et dash ne le supporte pas.

Remarques :

  1. L'utilisation d'un return $? explicite est facultatif. La fonction reviendra par défaut avec le code de sortie de la dernière commande exécutée.

  2. J'ai utilisé le formulaire POSIX pour définir des fonctions. Ceci est équivalent au formulaire bash mais vous donne un problème de moins à gérer si jamais vous devez exécuter la fonction sous un autre shell.

  3. bash accepte l'utilisation du caractère - dans un nom de fonction, mais c'est une fonctionnalité controversée. Je l'ai remplacé par _ qui est plus largement accepté. (Pour en savoir plus sur ce problème, consultez cette réponse.)

  4. Le -q option à grep le rend silencieux, ce qui signifie qu'il définit toujours un code de sortie approprié mais qu'il n'envoie aucun caractère à stdout.


J'ai appliqué ce qui suit pour la première ligne lue :

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

Cela supprime simplement la nomenclature de la variable.


Linux
  1. Comment vérifier si Bash a la vulnérabilité Shellshock ?

  2. Est-il possible de détecter quand un fichier a été téléchargé ?

  3. Comment détecter Bash>=4.0 ?

  4. Comment normaliser un chemin de fichier dans Bash ?

  5. Comment vérifier syslog dans Bash sous Linux ?

Comment utiliser la commande Linux head

Comment vérifier si un fichier ou un répertoire existe dans Bash

Comment lire un fichier ligne par ligne dans Bash

Comment rediriger stderr vers stdout dans Bash

Comment utiliser les opérateurs de test de fichiers Bash sous Linux

Comment vérifier si un fichier ou un répertoire existe dans Bash Shell