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
ファイルにUTF-8 BOMが含まれているかどうかわからない場合、これは(GNU sed
の実装を想定))、BOMが存在する場合は削除するか、そうでない場合、変更はありません。
sed '1s/^\xEF\xBB\xBF//' < orig.txt > new.txt
-i
オプションで既存のファイルを上書きすることもできます。
sed -i '1s/^\xEF\xBB\xBF//' orig.txt
BOMはUTF-8では意味がありません。これらは通常、Microsoft OS上の偽のソフトウェアによって誤って追加されます。
dos2unix
はそれを削除し、Windowsテキストファイルの他の特異性も処理します。
dos2unix test.xml
VIMでファイルを開く:
vi text.xml
BOMエンコーディングを削除します。
:set nobomb
保存して終了:
:wq
tail
コマンドを使用して、ファイルからBOMを削除することができます。
tail -c +4 withBOM.txt > withoutBOM.txt
使用できます
_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>
_が表示されません。
私はこれのためにレギュラーでvimワンライナーを使用します:
vim --clean -c 'se nobomb|wq' filename
vim --clean -c 'bufdo se nobomb|wqa' filename1 filename2 ...
最近私は任意のUTF-8エンコードファイルのBOMを追加または削除するこの小さなコマンドラインツールを見つけました: TF BOM Utils ( new link at github)
少し欠点は、プレーンなC++ソースコードのみをダウンロードできることです。 makefileを作成して(たとえば CMake を使用して)、自分でコンパイルする必要があります。このページではバイナリは提供されていません。