web-dev-qa-db-fra.com

Utiliser awk pour supprimer la marque d'ordre Byte

A quoi ressemblerait un script awk (probablement un one-liner) pour supprimer un BOM ?

Spécification:

  • imprimer chaque ligne après la première (NR > 1)
  • pour la première ligne: Si cela commence par #FE #FF ou #FF #FE, supprimez-les et imprimez le reste
102
Boldewyn

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, 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 BFUTF-8 Octets de nomenclature du tableau ci-dessus.

111
Bartosz

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
122
Denilson Sá Maia

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 ...

41
Steve Clay

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
20
Lri

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).

3
Arnon Zamir