Jawaban:
Coba ini:
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}{print}' INFILE > OUTFILE
Pada rekaman pertama (baris), hapus karakter BOM. Cetak setiap rekaman.
Atau sedikit lebih pendek, menggunakan pengetahuan bahwa tindakan default di awk adalah mencetak data:
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1' INFILE > OUTFILE
1
adalah kondisi terpendek yang selalu bernilai true, sehingga setiap record dicetak.
Nikmati!
- LAMPIRAN -
FAQ Unicode Byte Order Mark (BOM) menyertakan tabel berikut yang mencantumkan byte BOM yang tepat untuk setiap encoding:
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
Dengan demikian, Anda dapat melihat seberapa \xef\xbb\xbf
sesuai dengan EF BB BF
UTF-8
byte BOM dari tabel di atas.
awk '{if(NR==1)sub(/^\xef\xbb\xbf/,"");print}' INFILE > OUTFILE
dan pastikan INFILE dan OUTFILE berbeda!
perl -i.orig -pe 's/^\x{FFFE}//' badfile
Anda bisa mengandalkan PERL_UNICODE dan / atau PERLIO envariabel untuk encoding. PERL_UNICODE = SD akan berfungsi untuk UTF-8; untuk yang lain, Anda membutuhkan PERLIO.
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1'
Menggunakan GNU sed
(di Linux atau Cygwin):
# Removing BOM from all text files in current directory:
sed -i '1 s/^\xef\xbb\xbf//' *.txt
Di FreeBSD:
sed -i .bak '1 s/^\xef\xbb\xbf//' *.txt
Keuntungan menggunakan GNU atau FreeBSD sed
: -i
parameternya berarti "di tempat", dan akan memperbarui file tanpa perlu pengalihan atau trik aneh.
Di Mac:
awk
Solusi ini di jawaban lain berfungsi , tetapi sed
perintah di atas tidak berfungsi. Setidaknya pada sed
dokumentasi Mac (Sierra) tidak disebutkan dukungan pelolosan heksadesimal ala \xef
.
Trik serupa dapat dicapai dengan program apa pun dengan menyalurkan ke sponge
alat dari moreutils :
awk '…' INFILE | sponge INFILE
10.11.6
, ini tidak berfungsi, tetapi jawaban resmi stackoverflow.com/a/1068700/9636 berfungsi dengan baik.
Tidak awk, tapi lebih sederhana:
tail -c +4 UTF8 > UTF8.nobom
Untuk memeriksa BOM:
hd -n 3 UTF8
Jika BOM hadir, Anda akan melihat: 00000000 ef bb bf ...
cat file1.utf8 file2.utf8 file3.utf3 > allfiles.utf8
akan rusak. Jangan pernah menggunakan BOM pada UTF-8. Titik.
hd
tidak tersedia pada OS X (per 10.8.2), sehingga untuk memeriksa untuk UTF-8 BOM sana Anda dapat menggunakan berikut: head -c 3 file | od -t x1
.
Selain mengubah ujung baris CRLF ke LF, dos2unix
juga menghapus BOM:
dos2unix *.txt
dos2unix
juga mengonversi file UTF-16 dengan BOM (tetapi bukan file UTF-16 tanpa BOM) menjadi UTF-8 tanpa BOM:
$ 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
Saya tahu pertanyaan itu ditujukan pada unix / linux, saya pikir akan bermanfaat untuk menyebutkan opsi yang bagus untuk unix-challenge (di windows, dengan UI).
Saya mengalami masalah yang sama pada proyek WordPress (BOM menyebabkan masalah dengan rss feed dan validasi halaman) dan saya harus melihat semua file di pohon direktori yang cukup besar untuk menemukan file yang ada di BOM. Menemukan aplikasi bernama Replace Pioneer dan di dalamnya:
Batch Runner -> Search (untuk menemukan semua file di subfolder) -> Replace Template -> Binary remove BOM (ada pencarian yang sudah jadi dan ganti template untuk ini).
Itu bukan solusi yang paling elegan dan memang membutuhkan penginstalan program, yang merupakan sisi negatifnya. Tapi begitu saya menemukan apa yang terjadi di sekitar saya, itu bekerja seperti pesona (dan menemukan 3 file dari sekitar 2300 yang ada dengan BOM).