Question

Comment un scénario awk (probablement en une ligne) pour la suppression d'un BOM ressembler?

Caractéristique:

  • imprimer chaque ligne après la première (NR > 1)
  • pour la première ligne: Si elle commence par ou #FE #FF #FF #FE, retirez-les et imprimer le reste
Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top