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
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が含まれているかどうかわからない場合はsed
、BOMが存在する場合はこれを削除し(GNU実装を想定)、存在しない場合は変更を行いません。
sed '1s/^\xEF\xBB\xBF//' < orig.txt > new.txt
次の-i
オプションを使用して、既存のファイルを上書きすることもできます。
sed -i '1s/^\xEF\xBB\xBF//' orig.txt
en_US.UTF-8
ロケールでテストし、動作しました。いつ失敗しますか?
1s/
、最初の行のみを検索することを意味します。他の行は影響を受けません。この^
手段は、(最初の)行の先頭でのみ一致します。\xEF\xBB\xBF
UTF-8 BOM(エスケープされた16進文字列)です。//
何も置き換えないことを意味します。1
最後に(for 1s/^xEF\xBB\xBF//1
)を追加することもできますが、これはその行で最初に出現したパターンにのみ一致することを意味します。ただし、検索はに固定されている^
ため、違いはありません。ファイルの最初の行の先頭にBOMがない場合、パターンは一致しないため、変更は行われません。
BOMはUTF-8では意味がありません。これらは通常、Microsoft OS上の偽のソフトウェアによって誤って追加されます。
dos2unix
それを削除し、Windowsテキストファイルの他の特異性も処理します。
dos2unix test.xml
dos2unix
ますか?
tail
次のコマンドを使用して、ファイルからBOMを削除することができます。
tail -c +4 withBOM.txt > withoutBOM.txt
tail
1ベースのインデックス作成を使用していますか?!WTF!
tail -c -1
またはtail -c 1
(tail
一般的に使用される)はtail -c +1
、最初のバイトから始まる最後のバイトから始まるコンテンツです。tail -c 0
/ tail -c +0
そのためには、ずっと直感的ではありません。
(dd bs=1 count=3 of=/dev/null; cat) <input >output
。または、GNU (head -c3 >/dev/null; cat)
で-UTF8または他の1バイト以外のロケールでも; GNUヘッドは 'char' = byteを実行します。
VIMでファイルを開く:
vi text.xml
BOMエンコードを削除します。
:set nobomb
保存して終了:
:wq
<feff>
、まだ:set nobomb
それを変更したり、削除されません。
使用できます
LANG=C LC_ALL=C sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- filename
ファイルの先頭からバイトオーダーマークがある場合は削除し、CR LF改行をLFのみに変換します。LANG=C LC_ALL=C
あなたは、コマンドがバイトオーダーマークを形成する3つのバイトがバイトとして扱われます(また、デフォルトのPOSIXロケールとして知られている)、デフォルトのCロケールで実行したいシェルに指示します。-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
<U+FEFF>
UTF-8ターミナルにい文字が表示されません。
sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- "$@"
か?
sed -e 's/\r$// ; 1 s/^\xef\xbb\xbf//' -i -- "$@"
そうしません。終了コードを返しますが、終了する前に引数リストにリストされているすべてのファイルを処理します。
--
もちろん、ファイル名の前は重要です。これがないと、ダッシュで始まるファイル名がsedによってオプションと見なされる場合があります。それらを回答に編集しました。リマインダーをありがとう!
最近、任意のUTF-8エンコードファイルでBOMを追加または削除するこの小さなコマンドラインツールを見つけました。UTFBOM Utils(githubの新しいリンク)
小さな欠点は、プレーンなC ++ソースコードのみをダウンロードできることです。メイクファイルを作成し(たとえばCMakeを使用)、自分でコンパイルする必要があります。このページではバイナリは提供されていません。