[〜#〜] bom [〜#〜] を削除するためのawk
スクリプト(おそらくワンライナー)はどのように見えますか?
仕様:
NR > 1
)の後のすべての行を印刷します#FE #FF
または#FF #FE
で始まる場合は、それらを削除して残りを出力しますこれを試して:
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 BF
UTF-8
上記の表のBOMバイト。
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
Awkではなく、もっとシンプルに:
tail -c +4 UTF8 > UTF8.nobom
BOMを確認するには:
hd -n 3 UTF8
BOMが存在する場合、以下が表示されます:00000000 ef bb bf ...
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
私は質問がunix/linuxに向けられたことを知っています、unixに挑戦するための良いオプションに言及する価値があると思いました(ウィンドウで、UIを使用)。
WordPressプロジェクト(BOMがrssフィードとページ検証で問題を引き起こしていた)で同じ問題に遭遇しました。ツリーでBOMのあるものを見つけます Replace Pioneer と呼ばれるアプリケーションを見つけました:
バッチランナー->検索(サブフォルダー内のすべてのファイルを検索)->テンプレートの置換-> BOMのバイナリ削除(このための既製の検索および置換テンプレートがあります)。
これは最もエレガントなソリューションではなく、プログラムのインストールが必要でしたが、これはマイナス面です。しかし、自分の周りに何が起こっているのかを知ると、それは魅力のように機能しました(そして、BOMであった約2300から3つのファイルを見つけました)。