Essaye ça:
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}{print}' INFILE > OUTFILE
Sur le premier enregistrement (ligne), supprimez les caractères de la nomenclature. Imprimez chaque enregistrement.
Ou légèrement plus court, en sachant que l'action par défaut dans awk est d'imprimer l'enregistrement:
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1' INFILE > OUTFILE
1
est la condition la plus courte qui donne toujours la valeur true, de sorte que chaque enregistrement est imprimé.
Prendre plaisir!
-- ADDENDA --
La FAQ sur les marques d'ordre d'octets Unicode (BOM) comprend le tableau suivant répertoriant les octets exacts de la nomenclature pour chaque codage:
Bytes | Encoding Form
--------------------------------------
00 00 FE FF | UTF-32, big-endian
FF FE 00 00 | UTF-32, little-endian
FE FF | UTF-16, big-endian
FF FE | UTF-16, little-endian
EF BB BF | UTF-8
Ainsi, vous pouvez voir comment \xef\xbb\xbf
correspond aux EF BB BF
UTF-8
octets de la nomenclature du tableau ci-dessus.
awk '{if(NR==1)sub(/^\xef\xbb\xbf/,"");print}' INFILE > OUTFILE
et assurez-vous que INFILE et OUTFILE sont différents!perl -i.orig -pe 's/^\x{FFFE}//' badfile
vous pouvez vous fier à vos envariables PERL_UNICODE et / ou PERLIO pour l'encodage. PERL_UNICODE = SD fonctionnerait pour UTF-8; pour les autres, vous auriez besoin de PERLIO.awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1'
Utilisation de GNU
sed
(sous Linux ou Cygwin):Sur FreeBSD:
Avantage d'utiliser GNU ou FreeBSD
sed
: le-i
paramètre signifie "en place", et mettra à jour les fichiers sans avoir besoin de redirections ou de trucs bizarres.Sur Mac:
Cette
awk
solution dans une autre réponse fonctionne , mais lased
commande ci-dessus ne fonctionne pas. Au moins sur Mac (Sierra), lased
documentation ne mentionne pas la prise en charge de l'échappement hexadécimal ala\xef
.Une astuce similaire peut être réalisée avec n'importe quel programme en raccordant l'
sponge
outil à partir de moreutils :la source
10.11.6
, cela ne fonctionne pas, mais la réponse officielle stackoverflow.com/a/1068700/9636 fonctionne bien.Pas génial, mais plus simple:
Pour vérifier la nomenclature:
Si la nomenclature est présente, vous verrez:
00000000 ef bb bf ...
la source
cat file1.utf8 file2.utf8 file3.utf3 > allfiles.utf8
sera brisé. N'utilisez jamais de nomenclature sur UTF-8. Période.hd
n'est pas disponible sur OS X (à partir de 10.8.2), donc pour rechercher une nomenclature UTF-8, vous pouvez utiliser ce qui suit:head -c 3 file | od -t x1
.Outre la conversion des fins de ligne CRLF en LF,
dos2unix
supprime également les nomenclatures:dos2unix
convertit également les fichiers UTF-16 avec une nomenclature (mais pas les fichiers UTF-16 sans nomenclature) en UTF-8 sans nomenclature:la source
Je sais que la question était dirigée vers unix / linux, j'ai pensé qu'il valait la peine de mentionner une bonne option pour les défis Unix (sur Windows, avec une interface utilisateur).
J'ai rencontré le même problème sur un projet WordPress (BOM causait des problèmes avec le flux rss et la validation de page) et j'ai dû examiner tous les fichiers dans une assez grande arborescence de répertoires pour trouver celui qui était avec BOM. J'ai trouvé une application appelée Replace Pioneer et dedans:
Batch Runner -> Rechercher (pour trouver tous les fichiers dans les sous-dossiers) -> Remplacer le modèle -> Binary remove BOM (il existe un modèle de recherche et de remplacement prêt à l'emploi).
Ce n'était pas la solution la plus élégante et elle nécessitait l'installation d'un programme, ce qui est un inconvénient. Mais une fois que j'ai découvert ce qui se passait autour de moi, cela a fonctionné comme un charme (et j'ai trouvé 3 fichiers sur environ 2300 qui étaient avec BOM).
la source