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
Si vous n'êtes pas sûr si le fichier contient une nomenclature UTF-8, alors cela (en supposant que la mise en œuvre GNU de sed
) supprimera la nomenclature si elle existe, ou aucun changement si ce n'est pas le cas.
sed '1s/^\xEF\xBB\xBF//' < orig.txt > new.txt
Vous pouvez également remplacer le fichier existant par le -i
option:
sed -i '1s/^\xEF\xBB\xBF//' orig.txt
Une nomenclature n'a pas de sens en UTF-8. Ceux-ci sont généralement ajoutés par erreur par de faux logiciels sur les systèmes d'exploitation Microsoft.
dos2unix
le supprimera et prendra également en charge les autres particularités des fichiers texte Windows.
dos2unix test.xml
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 -c +4 withBOM.txt > withoutBOM.txt
Vous pouvez utiliser
LANG=C LC_ALL=C sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- filename
pour supprimer la marque d'ordre des octets du début du fichier, le cas échéant, ainsi que pour convertir tout CR LF sauts de ligne en LF uniquement. Le LANG=C LC_ALL=C
indique au shell que vous souhaitez que la commande s'exécute dans les paramètres régionaux C par défaut (également appelés paramètres régionaux POSIX par défaut), où les trois octets formant la marque d'ordre des octets sont traités comme des octets. Le -i
option pour sed signifie en place. Si tu utilises -i.old
, puis sed enregistre le fichier d'origine sous filename.old
, et le nouveau fichier (avec les modifications éventuelles) comme filename
.
Personnellement, j'aime avoir ceci comme ~/bin/fix-ms
; par exemple, comme
#!/bin/dash
export LANG=C LC_ALL=C
if [ $# -gt 0 ]; then
for FILE in "$@" ; do
sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- "$FILE" || exit 1
done
else
exec sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//'
fi
de sorte que si je dois appliquer cela pour dire tous les fichiers source et en-têtes C (mon ancien code de l'ère MS-DOS, par exemple!), je lance simplement
find . -name '*.[CHch]' -print0 | xargs -r0 ~/bin/ms-fix
ou, si je veux juste regarder un tel fichier, sans le modifier, je peux lancer
~/bin/ms-fix < filename | less
et ne pas voir le laid <U+FEFF>
dans mon terminal UTF-8.
J'utilise un vim one-liner sur le regular pour cela:
vim --clean -c 'se nobomb|wq' filename
vim --clean -c 'bufdo se nobomb|wqa' filename1 filename2 ...
Récemment, j'ai trouvé ce petit outil en ligne de commande qui ajoute ou supprime la nomenclature sur des fichiers encodés en UTF-8 arbitraires: TF BOM Utils ( nouveau lien sur github)
Petit inconvénient, vous pouvez télécharger uniquement le code source C++ simple. Vous devez créer le makefile (avec CMake , par exemple) et le compiler vous-même, les binaires ne sont pas fournis sur cette page.