web-dev-qa-db-ja.com

awkを使用してバイト順マークを削除する

[〜#〜] bom [〜#〜] を削除するためのawkスクリプト(おそらくワンライナー)はどのように見えますか?

仕様:

  • 最初の(NR > 1)の後のすべての行を印刷します
  • 1行目:#FE #FFまたは#FF #FEで始まる場合は、それらを削除して残りを出力します
102
Boldewyn

これを試して:

awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}{print}' INFILE > OUTFILE

最初のレコード(行)で、BOM文字を削除します。すべてのレコードを印刷します。

または、awkのデフォルトアクションはレコードの印刷であるという知識を使用して、少し短くします。

awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1' INFILE > OUTFILE

1は常にtrueと評価される最短条件であるため、各レコードが出力されます。

楽しい!

-補遺-

nicode Byte Order Mark(BOM)FAQ 各エンコードの正確なBOMバイトをリストする次の表が含まれます。

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

したがって、\xef\xbb\xbf に対応 EF BB BFUTF-8上記の表のBOMバイト。

111
Bartosz

GNU sedを使用(LinuxまたはCygwin)):

# Removing BOM from all text files in current directory:
sed -i '1 s/^\xef\xbb\xbf//' *.txt

FreeBSDの場合:

sed -i .bak '1 s/^\xef\xbb\xbf//' *.txt

GNUまたはFreeBSD sed-iパラメータは「インプレース」を意味し、リダイレクトや奇妙なトリックを必要とせずにファイルを更新します。

Macの場合:

別の答えのこのawkソリューションは動作します 、しかし上記のsedコマンドは動作しません。少なくともMac(Sierra)sedドキュメントでは、16進エスケープala \xef

moreutils からspongeツールにパイプすることで、任意のプログラムで同様のトリックを実現できます。

awk '…' INFILE | sponge INFILE
122

Awkではなく、もっとシンプルに:

tail -c +4 UTF8 > UTF8.nobom

BOMを確認するには:

hd -n 3 UTF8

BOMが存在する場合、以下が表示されます:00000000 ef bb bf ...

41
Steve Clay

CRLF行末をLFに変換することに加えて、dos2unixはBOMも削除します。

dos2unix *.txt

dos2unixは、BOMを含むUTF-16ファイル(BOMを含まないUTF-16ファイルは除く)をBOMを含まないUTF-8に変換します。

$ 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

私は質問がunix/linuxに向けられたことを知っています、unixに挑戦するための良いオプションに言及する価値があると思いました(ウィンドウで、UIを使用)。
WordPressプロジェクト(BOMがrssフィードとページ検証で問題を引き起こしていた)で同じ問題に遭遇しました。ツリーでBOMのあるものを見つけます Replace Pioneer と呼ばれるアプリケーションを見つけました:

バッチランナー->検索(サブフォルダー内のすべてのファイルを検索)->テンプレートの置換-> BOMのバイナリ削除(このための既製の検索および置換テンプレートがあります)。

これは最もエレガントなソリューションではなく、プログラムのインストールが必要でしたが、これはマイナス面です。しかし、自分の周りに何が起こっているのかを知ると、それは魅力のように機能しました(そして、BOMであった約2300から3つのファイルを見つけました)。

3
Arnon Zamir