回答:
これを試して:
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}{print}' INFILE > OUTFILE
最初のレコード(行)で、BOM文字を削除します。すべてのレコードを印刷します。
または、少し短く、awkのデフォルトのアクションはレコードを印刷することであるという知識を使用します。
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1' INFILE > OUTFILE
1
常にtrueと評価される最短の条件なので、各レコードが出力されます。
楽しい!
-補遺-
Unicodeバイトオーダーマーク(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
したがって、上の表からBOMバイトにどのように\xef\xbb\xbf
対応するかがわかりEF BB BF
UTF-8
ます。
awk '{if(NR==1)sub(/^\xef\xbb\xbf/,"");print}' INFILE > OUTFILE
そしてINFILEとOUTFILEが異なることを確認してください!
perl -i.orig -pe 's/^\x{FFFE}//' badfile
場合は、エンコーディングにPERL_UNICODEやPERLIO変数を使用できます。PERL_UNICODE = SDはUTF-8で機能します。他の人にはPERLIOが必要です。
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1'
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
。
moreutilssponge
からツールにパイプすることで、どのようなプログラムでも同様のトリックを実現できます。
awk '…' INFILE | sponge INFILE
10.11.6
では、これは機能しませんが、公式の回答であるstackoverflow.com/a/1068700/9636は正常に機能します。
awkではありませんが、より単純です:
tail -c +4 UTF8 > UTF8.nobom
BOMを確認するには:
hd -n 3 UTF8
BOMが存在する場合は、次のように表示されます。 00000000 ef bb bf ...
cat file1.utf8 file2.utf8 file3.utf3 > allfiles.utf8
壊れるだけです。UTF-8でBOMを使用しないでください。限目。
hd
OS X(10.8.2以降)では使用できません。そのため、UTF-8 BOMを確認するには、以下を使用できますhead -c 3 file | od -t x1
。
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に挑戦する(Windowsで、UIを使用する)ための良いオプションについて言及する価値があると思いました。
WordPressプロジェクトで同じ問題に遭遇し(BOMがrssフィードとページ検証で問題を引き起こしていた)、BOMにあるファイルを見つけるために非常に大きなディレクトリツリーのすべてのファイルを調べる必要がありました。Replace Pioneerというアプリケーションを見つけ、その中に:
バッチランナー->検索(サブフォルダー内のすべてのファイルを検索)->テンプレートの置換->バイナリーBOMの削除(このための既製の検索および置換テンプレートがあります)。
これは最もエレガントなソリューションではなく、プログラムをインストールする必要がありましたが、これは欠点です。しかし、周りに何が起こっているのかがわかると、それは魅力のように機能しました(BOMに関連する約2300のうち3つのファイルが見つかりました)。