En utilisant awk pour enlever la marque d'ordre d'octet
-
21-08-2019 - |
La solution
Essayez ceci:
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}{print}' INFILE > OUTFILE
Sur le premier enregistrement (ligne), supprimer les caractères de nomenclature. Imprimer chaque enregistrement.
Ou un peu plus court, en utilisant les connaissances 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 plus courte condition est toujours vraie, de sorte que chaque enregistrement est imprimé.
Amusez-vous!
- ADDENDA -
Unicode Byte Order FAQ Mark (BOM) comprend le tableau ci-dessous la liste de la nomenclature exacte octets 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 correspond à \xef\xbb\xbf
BOM octets EF BB BF
de UTF-8
le tableau ci-dessus.
Autres conseils
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
L'avantage de l'utilisation de GNU ou FreeBSD -i
: le paramètre signifie awk
« en place », et mettra à jour les fichiers sans avoir besoin de trucs bizarres ou redirections
Sur Mac:
Cette solution dans une autre réponse \xef
fonctionne , mais la commande ne fonctionne pas sponge
ci-dessus. Au moins sur Mac (Sierra) la documentation ne hexadécimal <=> mentionne pas le soutien échapper ala <=>.
Une astuce similaire peut être obtenu avec un programme par une canalisation à l'outil de rel="noreferrer"> moreutils :
awk '…' INFILE | sponge INFILE
Non awk, mais plus simple:
tail -c +4 UTF8 > UTF8.nobom
Pour vérifier la nomenclature:
hd -n 3 UTF8
Si la nomenclature est présent, vous verrez: 00000000 ef bb bf ...
En plus de convertir les fins de ligne CRLF à LF, dos2unix
supprime également les nomenclatures:
dos2unix *.txt
<=> convertit également les fichiers UTF-16 avec une nomenclature (mais pas les fichiers UTF-16 sans une nomenclature) en UTF-8 sans BOM:
$ 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 a été posée à unix / linux, pensé qu'il serait intéressant de mentionner une bonne option pour le défi unix (sur les fenêtres, avec une interface utilisateur).
Je suis tombé sur la même question sur un projet WordPress (BOM a été à l'origine des problèmes avec flux rss et validation de la page) et je devais regarder dans tous les fichiers dans une arborescence de répertoires assez grand pour trouver celui qui était avec la nomenclature. Trouvé une application appelée Remplacer Pioneer et il:
Lot Runner -> Rechercher (pour trouver tous les fichiers dans les sous-dossiers) -> Remplacer un modèle -> binaire supprimer nomenclature (il y a une recherche et remplacer tout fait modèle pour cela).
Il n'a pas été la solution la plus élégante et il ne nécessite 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, il a travaillé comme un charme (et trouvé 3 fichiers sur environ 2300 qui étaient avec BOM).