J'ai un fichier en encodage UTF-8 avec BOM et je souhaite supprimer la BOM. Existe-t-il des outils de ligne de commande Linux pour supprimer la nomenclature du fichier?
$ file test.xml
test.xml: XML 1.0 document, UTF-8 Unicode (with BOM) text, with very long lines
Une nomenclature est un point de code Unicode U + FEFF; le codage UTF-8 se compose des trois valeurs hexadécimales 0xEF, 0xBB, 0xBF.
Avec bash, vous pouvez créer une nomenclature UTF-8 avec le formulaire de devis spécial $''
, Qui implémente les échappements Unicode: $'\uFEFF'
. Ainsi, avec bash, un moyen fiable de supprimer une nomenclature UTF-8 au début d'un fichier texte serait:
sed -i $'1s/^\uFEFF//' file.txt
Cela laissera le fichier inchangé s'il ne démarre pas avec une nomenclature UTF-8 et supprimera sinon la nomenclature.
Si vous utilisez un autre shell, vous constaterez peut-être que "$(printf '\ufeff')"
produit le caractère de nomenclature (qui fonctionne avec zsh
ainsi que tout shell sans printf
intégré, à condition que /usr/bin/printf
Est la version Gnu), mais si vous voulez une version compatible Posix vous pouvez utiliser:
sed "$(printf '1s/^\357\273\277//)" file.txt
(L'indicateur de modification sur place -i
Est également une extension Gnu; cette version écrit le fichier éventuellement modifié sur stdout.)
Ouvrir un fichier dans VIM:
vi text.xml
Supprimer l'encodage de nomenclature:
:set nobomb
Sauvegarder et quitter:
:wq
Il est possible de supprimer la nomenclature d'un fichier avec la commande tail
:
tail --bytes=+4 withBOM.txt > withoutBOM.txt
Eh bien, je viens de traiter cela aujourd'hui et ma façon préférée était dos2unix:
dos2unix supprimera la nomenclature et prendra également en charge les autres particularités des autres SO:
$ Sudo apt install dos2unix
$ dos2unix test.xml
Il est également possible de supprimer la nomenclature uniquement (-r, --remove-bom):
$ dos2unix -r test.xml
Remarque: testé avec dos2unix 7.3.4