web-dev-qa-db-ja.com

BOMをUTF-8ファイルから削除するにはどうすればよいですか?

BOMを含むUTF-8エンコーディングのファイルがあり、BOMを削除したい。ファイルからBOMを削除するLinuxコマンドラインツールはありますか?

$ file test.xml
test.xml:  XML 1.0 document, UTF-8 Unicode (with BOM) text, with very long lines
74
m13r

ファイルにUTF-8 BOMが含まれているかどうかわからない場合、これは(GNU sedの実装を想定))、BOMが存在する場合は削除するか、そうでない場合、変更はありません。

sed '1s/^\xEF\xBB\xBF//' < orig.txt > new.txt

-iオプションで既存のファイルを上書きすることもできます。

sed -i '1s/^\xEF\xBB\xBF//' orig.txt
84
CSM

BOMはUTF-8では意味がありません。これらは通常、Microsoft OS上の偽のソフトウェアによって誤って追加されます。

dos2unixはそれを削除し、Windowsテキストファイルの他の特異性も処理します。

dos2unix test.xml
72

VIMの使用

  1. VIMでファイルを開く:

    vi text.xml
    
  2. BOMエンコーディングを削除します。

    :set nobomb
    
  3. 保存して終了:

    :wq
    
33
Joshua Pinter

tailコマンドを使用して、ファイルからBOMを削除することができます。

tail -c +4 withBOM.txt > withoutBOM.txt
28
m13r

使用できます

_LANG=C LC_ALL=C sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- filename
_

ファイルの先頭にバイトオーダーマークがある場合はそれを削除し、CR LF改行をLFのみに変換します。_LANG=C LC_ALL=C_は、コマンドをデフォルトのCロケール(デフォルトのPOSIXロケールとも呼ばれる)で実行するようにシェルに指示します。この場合、バイトオーダーマークを形成する3バイトはバイトとして扱われます。_-i_オプションをsedはインプレースを意味します。_-i.old_を使用する場合、sedは元のファイルを_filename.old_として保存し、新しいファイル(変更がある場合は)をfilenameとして保存します。


私は個人的にこれを_~/bin/fix-ms_として持つのが好きです。たとえば、

_#!/bin/dash
export LANG=C LC_ALL=C
if [ $# -gt 0 ]; then
    for FILE in "$@" ; do
        sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- "$FILE" || exit 1
    done
else
    exec sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//'
fi
_

これを適用してすべてのCソースファイルとヘッダー(たとえば、MS-DOS時代の古いコード)を言う必要がある場合は、次のように実行します。

_find . -name '*.[CHch]' -print0 | xargs -r0 ~/bin/ms-fix
_

または、そのようなファイルを変更せずに見たいだけの場合は、

_~/bin/ms-fix < filename | less
_

そして、UTF-8端末で醜い_<U+FEFF>_が表示されません。

5
Nominal Animal

私はこれのためにレギュラーでvimワンライナーを使用します:

vim --clean -c 'se nobomb|wq' filename

vim --clean -c 'bufdo se nobomb|wqa' filename1 filename2 ...
3
Trevor Murdock

最近私は任意のUTF-8エンコードファイルのBOMを追加または削除するこの小さなコマンドラインツールを見つけました: TF BOM Utilsnew link at github)

少し欠点は、プレーンなC++ソースコードのみをダウンロードできることです。 makefileを作成して(たとえば CMake を使用して)、自分でコンパイルする必要があります。このページではバイナリは提供されていません。

0