जवाबों:
इसे इस्तेमाल करे:
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}{print}' INFILE > OUTFILE
पहले रिकॉर्ड (लाइन) पर, BOM वर्ण हटाएं। हर रिकॉर्ड को प्रिंट करें।
या थोड़ा कम, इस ज्ञान का उपयोग करके कि awk में डिफ़ॉल्ट क्रिया रिकॉर्ड को प्रिंट करना है:
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1' INFILE > OUTFILE
1
सबसे छोटी स्थिति है जो हमेशा सच का मूल्यांकन करती है, इसलिए प्रत्येक रिकॉर्ड मुद्रित होता है।
का आनंद लें!
- जोड़ें -
यूनिकोड बाइट ऑर्डर मार्क (बीओएम) सामान्य प्रश्न में प्रत्येक एन्कोडिंग के लिए सटीक बीओएम बाइट्स को सूचीबद्ध करने वाली निम्न तालिका शामिल है:
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
इस प्रकार, आप देख सकते हैं कि उपरोक्त तालिका से बीओएम बाइट्स के \xef\xbb\xbf
अनुरूप कैसे हैं EF BB BF
UTF-8
।
awk '{if(NR==1)sub(/^\xef\xbb\xbf/,"");print}' INFILE > OUTFILE
और सुनिश्चित करें कि शख्सियत और OUTFILE अलग हैं!
perl -i.orig -pe 's/^\x{FFFE}//' badfile
करते हैं तो आप एन्कोडिंग के लिए अपने PERL_UNICODE और / या PERLIO एन्वारिएबल्स पर भरोसा कर सकते हैं। PERL_UNICODE = SD UTF-8 के लिए काम करेगा; दूसरों के लिए, आपको PERLIO की आवश्यकता होगी।
awk 'NR==1{sub(/^\xef\xbb\xbf/,"")}1'
GNU sed
(लिनक्स या सिगविन पर) का उपयोग करना :
# Removing BOM from all text files in current directory:
sed -i '1 s/^\xef\xbb\xbf//' *.txt
FreeBSD पर:
sed -i .bak '1 s/^\xef\xbb\xbf//' *.txt
जीएनयू या फ्रीबीएसडी का उपयोग करने का लाभ sed
: -i
पैरामीटर का अर्थ है "जगह में", और पुनर्निर्देशन या अजीब चाल की आवश्यकता के बिना फ़ाइलों को अपडेट करेगा।
मैक पर:
awk
एक अन्य उत्तर में यह समाधान काम करता है , लेकिन sed
ऊपर का आदेश काम नहीं करता है। कम से कम मैक (सिएरा) sed
प्रलेखन में हेक्साडेसिमल से बचने वाले अला का समर्थन करने का उल्लेख नहीं है \xef
।
एक समान ट्रिक को किसी भी प्रोग्राम के साथ टूल्यूटsponge
से पाइपिंग द्वारा प्राप्त किया जा सकता है :
awk '…' INFILE | sponge INFILE
10.11.6
, यह काम नहीं करता है, लेकिन आधिकारिक उत्तर stackoverflow.com/a/1068700/9636 ठीक काम करता है।
जाग नहीं है, लेकिन सरल:
tail -c +4 UTF8 > UTF8.nobom
BOM की जांच करने के लिए:
hd -n 3 UTF8
यदि BOM मौजूद है तो आप देखेंगे: 00000000 ef bb bf ...
cat file1.utf8 file2.utf8 file3.utf3 > allfiles.utf8
टूट जाएगा। कभी भी UTF-8 पर BOM का उपयोग न करें। अवधि।
hd
ओएस एक्स (10.8.2 के रूप में) पर उपलब्ध नहीं है, इसलिए एक के लिए जाँच करने के लिए UTF-8 बीओएम वहाँ आप निम्नलिखित का उपयोग कर सकते हैं: head -c 3 file | od -t x1
।
CRLF लाइन अंत को LF में परिवर्तित करने के अलावा, dos2unix
BOM को भी हटाता है:
dos2unix *.txt
dos2unix
बिना BOM के भी UTM-16 फ़ाइलों को BOM (लेकिन बिना BOM के UTF-16 फ़ाइलों) में परिवर्तित करता है:
$ 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
मुझे पता है कि सवाल यूनिक्स / लाइनक्स में निर्देशित किया गया था, सोचा कि यूनिक्स-चैलेंज्ड (विंडोज़ पर, यूआई के साथ) के लिए एक अच्छा विकल्प का उल्लेख करना उचित होगा।
मैं एक वर्डप्रेस परियोजना पर एक ही मुद्दे में भाग गया (बीओएम को आरएसएस फ़ीड और पृष्ठ सत्यापन के साथ समस्याएं पैदा हो रही थीं) और मुझे बीओएम के साथ खोजने के लिए काफी बड़ी निर्देशिका ट्री में सभी फाइलों को देखना पड़ा। बदले पायनियर नामक एक एप्लिकेशन मिला और इसमें:
बैच रनर -> खोज (सबफ़ोल्डर में सभी फ़ाइलों को खोजने के लिए) -> टेम्पलेट बदलें -> बाइनरी निकालें बीओएम (इसके लिए एक तैयार की गई खोज और प्रतिस्थापित टेम्पलेट है)।
यह सबसे सुरुचिपूर्ण समाधान नहीं था और इसे एक कार्यक्रम स्थापित करने की आवश्यकता थी, जो एक नकारात्मक पहलू है। लेकिन एक बार जब मुझे पता चला कि मेरे आसपास क्या चल रहा है, तो यह एक आकर्षण की तरह काम करता था (और 2300 में से 3 फाइलें मिलीं जो बीओएम के साथ थीं)।