J'ai un fichier en codage UTF-8 avec nomenclature et je souhaite supprimer la nomenclature. 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
Réponses:
Si vous ne savez pas si le fichier contient une nomenclature UTF-8, cela (en supposant que la mise en oeuvre GNU de
sed
) supprime la nomenclature si elle existe ou ne fait aucune modification si elle ne l’a pas.Vous pouvez également écraser le fichier existant avec l'
-i
option suivante:la source
en_US.UTF-8
paramètres régionaux et cela a fonctionné. Quand va-t-il échouer?1s/
signifie seulement chercher dans la première ligne; les autres lignes ne sont pas affectées. Les^
moyennes ne correspondent qu'au début de la (première) ligne.\xEF\xBB\xBF
est la nomenclature UTF-8 (chaîne hexadécimale échappée).//
signifie remplacer avec rien. J'aurais pu ajouter1
à la fin (pour1s/^xEF\xBB\xBF//1
), ce qui signifierait seulement correspondre à la première occurrence du motif sur la ligne. Mais comme la recherche est ancrée avec^
, cela ne fera aucune différence. Si le fichier ne contient pas la nomenclature au début de la première ligne, le modèle ne correspond pas et aucune modification n'est donc apportée.Une nomenclature n'a pas de sens dans UTF-8. Ceux-ci sont généralement ajoutés par erreur par un logiciel bidon sur les systèmes d'exploitation Microsoft.
dos2unix
va l'enlever et également prendre en charge d'autres idiosyncrasies de fichiers texte Windows.la source
dos2unix
?Il est possible de supprimer la nomenclature d'un fichier à l'aide de la
tail
commande suivante:la source
tail
utilise 1 indexation basée?! WTF!tail -c -1
outail -c 1
(ce quitail
est généralement utilisé pour) est le contenu commençant par le dernier octet,tail -c +1
commençant par le premier octet.tail -c 0
/tail -c +0
cela serait beaucoup moins intuitif.(dd bs=1 count=3 of=/dev/null; cat) <input >output
. Ou avec GNU(head -c3 >/dev/null; cat)
- même en UTF8 ou dans d'autres paramètres régionaux autres qu'un octets; La tête GNU fait 'char' = octet.Utiliser VIM
Ouvrir le fichier dans VIM:
Supprimer le codage de la nomenclature:
Sauvegarder et quitter:
la source
<feff>
, mais:set nobomb
ne le modifie ni ne le supprime.Vous pouvez utiliser
pour supprimer la marque d'ordre des octets au début du fichier, le cas échéant, ainsi que pour convertir les nouvelles lignes CR LF en LF uniquement. Il
LANG=C LC_ALL=C
indique au shell que la commande doit être exécutée 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 d'octet sont traités comme des octets. L'-i
option de sed signifie in-situ. Si vous utilisez-i.old
, sed enregistre le fichier d'origine sousfilename.old
le nouveau fichier (avec les modifications éventuelles) sousfilename
.Je tiens personnellement à avoir cela comme
~/bin/fix-ms
; par exemple, commede sorte que si j’ai besoin d’appliquer ceci pour dire tous les fichiers sources C et tous les en-têtes (mon ancien code de l’ère MS-DOS, par exemple!), je ne fais que lancer
ou, si je veux juste regarder un tel fichier, sans le modifier, je peux courir
et pas voir le laid
<U+FEFF>
dans mon terminal UTF-8.la source
sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- "$@"
?sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- "$@"
ne fonctionne pas; il renvoie un code de sortie, mais il traite tous les fichiers listés dans la liste des arguments avant de quitter.--
avant le (s) nom (s) de fichier est bien sûr important: sans cela, les noms de fichier commençant par un tiret peuvent être considérés comme des options par sed. J'ai modifié ceux-ci dans ma réponse; Merci pour le rappel!Récemment, j'ai trouvé ce petit outil de ligne de commande qui ajoute ou supprime la nomenclature sur des fichiers encodés au format UTF-8 arbitraires: UTF BOM Utils ( nouveau lien sur github).
Petit inconvénient, vous ne pouvez télécharger que le code source en clair C ++. Vous devez créer le fichier makefile (avec CMake , par exemple) et le compiler vous-même. Les fichiers binaires ne sont pas fournis sur cette page.
la source