Yanıtlar:
Bunu dene:
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}{print}' INFILE > OUTFILE
İlk kayıtta (satır), BOM karakterlerini kaldırın. Her kaydı yazdırın.
Veya biraz daha kısa, awk'deki varsayılan eylemin kaydı yazdırmak olduğu bilgisini kullanarak:
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1' INFILE > OUTFILE
1
her zaman doğru olarak değerlendirilen en kısa koşuldur, bu nedenle her kayıt yazdırılır.
Zevk almak!
- EK -
Unicode Bayt Sırası İşareti (BOM) SSS , her kodlama için tam ürün reçetesi baytlarını listeleyen aşağıdaki tabloyu içerir:
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
Böylece, yukarıdaki tablodan BOM baytlarına nasıl \xef\xbb\xbf
karşılık geldiğini görebilirsiniz EF BB BF
UTF-8
.
awk '{if(NR==1)sub(/^\xef\xbb\xbf/,"");print}' INFILE > OUTFILE
INFILE ve OUTFILE'ın farklı olduğundan emin olun!
perl -i.orig -pe 's/^\x{FFFE}//' badfile
Eğer şifreleme için PERL_UNICODE ve / veya PERLIO envariables güvenebileceğini. PERL_UNICODE = SD, UTF-8 için çalışacaktır; diğerleri için PERLIO'ya ihtiyacınız var.
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1'
GNU kullanarak sed
(Linux veya Cygwin'de):
# Removing BOM from all text files in current directory:
sed -i '1 s/^\xef\xbb\xbf//' *.txt
FreeBSD'de:
sed -i .bak '1 s/^\xef\xbb\xbf//' *.txt
GNU veya FreeBSD kullanmanın avantajı sed
: -i
parametre "yerinde" anlamına gelir ve yeniden yönlendirmelere veya garip numaralara gerek kalmadan dosyaları günceller.
Mac'te:
Bu awk
çözüm başka bir cevapta işe yarıyor , ancak sed
yukarıdaki komut çalışmıyor. En azından Mac (Sierra) sed
dokümantasyonunda onaltılık kaçmayı desteklediğinden bahsetmiyor \xef
.
Benzer bir numara, herhangi bir programda moreutils'tensponge
araca bağlanarak elde edilebilir :
awk '…' INFILE | sponge INFILE
10.11.6
bu işe yaramıyor, ancak resmi yanıt stackoverflow.com/a/1068700/9636 iyi çalışıyor.
Awk değil, daha basit:
tail -c +4 UTF8 > UTF8.nobom
Malzeme Listesini kontrol etmek için:
hd -n 3 UTF8
Ürün reçetesi varsa şunları göreceksiniz: 00000000 ef bb bf ...
cat file1.utf8 file2.utf8 file3.utf3 > allfiles.utf8
kırılacak. UTF-8'de asla bir BOM kullanmayın. Dönem.
hd
(10.8.2 itibariyle) OS X üzerinde mevcut değildir, bu nedenle kontrol etmek için UTF-8 BOM orada aşağıdakileri kullanabilirsiniz: head -c 3 file | od -t x1
.
CRLF satır sonlarını LF'ye dönüştürmenin yanı sıra, dos2unix
BOM'leri de kaldırır:
dos2unix *.txt
dos2unix
ayrıca BOM içeren UTF-16 dosyalarını (ancak BOM içermeyen UTF-16 dosyalarını değil), BOM olmadan UTF-8'e dönüştürür:
$ 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
Sorunun unix / linux'a yönelik olduğunu biliyorum, unix'e meydan okuyanlar için iyi bir seçenekten bahsetmeye değer olduğunu düşündüm (pencerelerde, bir UI ile).
Bir WordPress projesinde aynı sorunla karşılaştım (BOM, rss beslemesi ve sayfa doğrulamasında sorunlara neden oluyordu) ve BOM ile olanı bulmak için oldukça büyük bir dizin ağacındaki tüm dosyalara bakmam gerekti. Replace Pioneer adlı bir uygulama buldum ve içinde:
Toplu Çalıştırıcı -> Ara (alt klasörlerdeki tüm dosyaları bulmak için) -> Şablonu Değiştir -> İkili, BOM'yi kaldır (bunun için hazır bir arama ve değiştirme şablonu vardır).
En zarif çözüm değildi ve bir dezavantajı olan bir program yüklemeyi gerektiriyordu. Ama etrafımda neler döndüğünü öğrendiğimde, bir cazibe gibi çalıştı (ve BOM ile olan yaklaşık 2300 dosyadan 3'ünü buldu).