1. ホーム
  2. unicode

[解決済み] awk を使ってバイトオーダーマークを削除する

2022-10-27 23:07:33

質問

どのように awk を削除するスクリプト (おそらくワンライナー) はどうなるでしょうか。 BOM のように見えますか?

仕様書です。

  • 最初の行の次の行を表示する ( 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 は常に真と評価される最短の条件であるため、各レコードが出力されます。

お楽しみに

-- ADDENDUM --

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

このように \xef\xbb\xbf に対応する EF BB BF UTF-8 上表のBOMバイト。