BOMを削除するためのawk
スクリプト(おそらくワンライナー)はどのようになりますか?
仕様:
NR > 1
最初の( )の後のすべての行を印刷します#FE #FF
最初の行の場合:またはで始まる場合は#FF #FE
、それらを削除して残りを印刷します
BOMを削除するためのawk
スクリプト(おそらくワンライナー)はどのようになりますか?
仕様:
NR > 1
最初の( )の後のすべての行を印刷します#FE #FF
最初の行の場合:またはで始まる場合は#FF #FE
、それらを削除して残りを印刷しますGNUsed
の使用(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
これを試して:
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ではありませんが、より単純です。
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に挑戦した人のための良いオプションに言及する価値があると思いました(Windowsで、UIを使って)。
WordPressプロジェクトで同じ問題が発生し(BOMがRSSフィードとページ検証で問題を引き起こしていました)、非常に大きなディレクトリツリー内のすべてのファイルを調べて、BOMにあるファイルを見つける必要がありました。ReplacePioneerというアプリケーションが見つかりました。
バッチランナー->検索(サブフォルダー内のすべてのファイルを検索するため)->テンプレートの置換-> BOMのバイナリ削除(このための既製の検索と置換テンプレートがあります)。
これは最も洗練されたソリューションではなく、プログラムをインストールする必要がありましたが、これには欠点があります。しかし、自分の周りで何が起こっているのかを知ると、それは魅力のように機能しました(そして、約2300のうち3つのファイルがBOMに含まれていたことがわかりました)。