A quoi ressemblerait un script awk
(probablement un one-liner) pour supprimer un BOM ?
Spécification:
NR > 1
)#FE #FF
ou #FF #FE
, supprimez-les et imprimez le resteEssaye ç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, sachant que l'action par défaut dans awk consiste à imprimer l'enregistrement:
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1' INFILE > OUTFILE
1
est la condition la plus courte qui évalue toujours la valeur vraie. Chaque enregistrement est imprimé.
Prendre plaisir!
- ADDENDUM -
FAQ Unicode Byte Order Mark (BOM) inclut le tableau suivant répertoriant les octets de nomenclature exacts 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 à EF BB BF
UTF-8
Octets de nomenclature du tableau ci-dessus.
Utilisation de GNU sed
(sous Linux ou Cygwin):
# Removing BOM from all text files in current directory:
sed -i '1 s/^\xef\xbb\xbf//' *.txt
Sur FreeBSD:
sed -i .bak '1 s/^\xef\xbb\xbf//' *.txt
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 d’astuces étranges.
Sur Mac:
Cette solution awk
d'une autre réponse fonctionne , mais la commande sed
ci-dessus ne fonctionne pas. Au moins sur Mac (Sierra) sed
la documentation ne mentionne pas la possibilité de prendre en charge l'échappement hexadécimal ala \xef
.
Un programme similaire peut être réalisé avec n’importe quel programme en se connectant à l’outil sponge
de moreutils :
awk '…' INFILE | sponge INFILE
Pas génial, mais plus simple:
tail -c +4 UTF8 > UTF8.nobom
Pour vérifier la nomenclature:
hd -n 3 UTF8
Si BOM est présent, vous verrez: 00000000 ef bb bf ...
En plus de convertir les fins de ligne CRLF en BF, dos2unix
supprime également les nomenclatures:
dos2unix *.txt
dos2unix
convertit également les fichiers UTF-16 avec une nomenclature (mais pas les fichiers UTF-16 sans nomenclature) en UTF-8 sans nomenclature:
$ printf '\ufeffä\n'|iconv -f utf-8 -t utf-16be>bom-utf16be
$ printf '\ufeffä\n'|iconv -f utf-8 -t utf-16le>bom-utf16le
$ printf '\ufeffä\n'>bom-utf8
$ printf 'ä\n'|iconv -f utf-8 -t utf-16be>utf16be
$ printf 'ä\n'|iconv -f utf-8 -t utf-16le>utf16le
$ printf 'ä\n'>utf8
$ for f in *;do printf '%11s %s\n' $f $(xxd -p $f);done
bom-utf16be feff00e4000a
bom-utf16le fffee4000a00
bom-utf8 efbbbfc3a40a
utf16be 00e4000a
utf16le e4000a00
utf8 c3a40a
$ dos2unix -q *
$ for f in *;do printf '%11s %s\n' $f $(xxd -p $f);done
bom-utf16be c3a40a
bom-utf16le c3a40a
bom-utf8 c3a40a
utf16be 00e4000a
utf16le e4000a00
utf8 c3a40a
Je sais que la question visait unix/linux, pensait qu'il valait la peine de mentionner une bonne option pour les utilisateurs contestés par Unix (sous Windows, avec une interface utilisateur).
J'ai rencontré le même problème sur un projet WordPress (la nomenclature posait des problèmes de validation des flux rss et des pages)) et je devais examiner tous les fichiers dans un assez grand répertoire. Pour trouver celui qui était avec BOM, trouver une application appelée Remplacer Pioneer et dans celle-ci:
Batch Runner -> Recherche (pour trouver tous les fichiers dans les sous-dossiers) -> Remplacer le modèle -> Binaire supprimer la nomenclature (il existe un modèle de recherche et de remplacement prêt à l'emploi pour cela).
Ce n'était pas la solution la plus élégante et cela 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é à merveille (et j'ai trouvé 3 fichiers sur 2300 environ avec BOM).