107

BOMを削除するためのawkスクリプト(おそらくワンライナー)はどのようになりますか?

仕様:

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

5 に答える 5

126

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
于 2010-09-01T21:06:02.737 に答える
117

これを試して:

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

于 2009-07-01T11:45:59.413 に答える
42

awkではありませんが、より単純です。

tail -c +4 UTF8 > UTF8.nobom

BOMを確認するには:

hd -n 3 UTF8

BOMが存在する場合は、次のように表示されます。00000000 ef bb bf ...

于 2010-02-15T20:07:07.813 に答える
21

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

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
于 2013-09-29T12:43:57.133 に答える
3

私は質問がunix/linuxに向けられたことを知っています、unixに挑戦した人のための良いオプションに言及する価値があると思いました(Windowsで、UIを使って)。
WordPressプロジェクトで同じ問題が発生し(BOMがRSSフィードとページ検証で問題を引き起こしていました)、非常に大きなディレクトリツリー内のすべてのファイルを調べて、BOMにあるファイルを見つける必要がありました。ReplacePioneerというアプリケーションが見つかりました。

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

これは最も洗練されたソリューションではなく、プログラムをインストールする必要がありましたが、これには欠点があります。しかし、自分の周りで何が起こっているのかを知ると、それは魅力のように機能しました(そして、約2300のうち3つのファイルがBOMに含まれていたことがわかりました)。

于 2012-03-21T10:20:33.763 に答える