मेरे पास UTF-8 में BOM के साथ एन्कोडिंग है और 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 के साथ एन्कोडिंग है और 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
en_US.UTF-8
लोकेल के साथ परखा है और यह काम किया है। यह कब फेल होगा?
-<U+FEFF>\chapter{xxx}
बाद: +\chapter{xxx}^M
स्पष्टीकरण: लेटेक्स-फ़ाइल में टाइपो के लिए एमएस-शब्द का उपयोग करना। लिनक्स के तहत लेटेक्स त्रुटियों का उल्लेख कर रहा है। आउटपुट एक गिट सिस्टम से है। मैं इस विशेष मामले को पकड़ने के लिए अभिव्यक्ति को कैसे बदल सकता हूं?
UTM-8 में BOM का कोई मतलब नहीं है। वे आम तौर पर Microsoft OSes पर बोगस सॉफ़्टवेयर द्वारा गलती से जोड़े जाते हैं।
dos2unix
इसे हटा देगा और Windows पाठ फ़ाइलों की अन्य idiosyncrasies का भी ध्यान रखेगा।
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
। या जीएनयू के साथ (head -c3 >/dev/null; cat)
- यहां तक कि यूटीएफ 8 या अन्य गैर-सिंगलबाइट लोकेल में भी; GNU हेड 'चार' = बाइट करता है।
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
फ़ाइल की शुरुआत से बाइट ऑर्डर मार्क को हटाने के लिए, यदि इसके पास कोई है, साथ ही किसी भी सीआर एलएफ न्यूलाइन को केवल एलएफ में परिवर्तित करें। LANG=C LC_ALL=C
खोल आप कमांड डिफ़ॉल्ट सी लोकेल (यह भी डिफ़ॉल्ट POSIX स्थान के रूप में जाना जाता है), जहां बाइट आदेश मार्क के गठन तीन बाइट्स बाइट के रूप में इलाज कर रहे हैं में चलाना चाहते हैं बताता है। -i
सेड करने का विकल्प इन-प्लेस का मतलब है। यदि आप उपयोग करते हैं -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
इतना है कि अगर मैं सभी सी स्रोत फ़ाइलों और हेडर (एमएस-डॉस से मेरा पुराना कोड, उदाहरण के लिए!) कहने के लिए इसे लागू करने की आवश्यकता है, तो मैं बस चलाता हूं।
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 को जोड़ती या हटाती है: UTF BOM Utils ( github पर नया लिंक )
थोड़ा दोष, आप केवल सादे C ++ स्रोत कोड डाउनलोड कर सकते हैं। आपको मेकफाइल ( सीएमके के साथ , उदाहरण के लिए) बनाना होगा और इसे खुद से संकलित करना होगा, इस पृष्ठ पर बायनेरिज़ प्रदान नहीं किए गए हैं।