2009-12-29 14 views
11

मैं एक स्क्रिप्ट कि .csv फ़ाइलें को साफ, कुछ बुरी अल्पविराम के और बुरे उद्धरण चिह्न निकाल कर लिखा है (बुरा, मतलब है कि वे घर कार्यक्रम में एक को तोड़ने के हम इन फ़ाइलों को बदलने के लिए उपयोग करें) एसईडी का उपयोग कर:मेरी बैश स्क्रिप्ट फाइलों की शुरुआत में <feff> क्यों जोड़ रही है?

# remove all commas, and re-insert the good commas using clean.sed 
sed -f clean.sed $1 > $1.1st 

# remove all quotes 
sed 's/\"//g' $1.1st > $1.tmp 

# add the good quotes around good commas 
sed 's/\,/\"\,\"/g' $1.tmp > $1.tmp1 

# add leading quotes 
sed 's/^/\"/' $1.tmp1 > $1.tmp2 

# add trailing quotes 
sed 's/$/\"/' $1.tmp2 > $1.tmp3 

# remove utf characters 
sed 's/<feff>//' $1.tmp3 > $1.tmp4 

# replace original file with new stripped version and delete .tmp files 
cp -rf $1.tmp4 quotes_$1 

यहाँ clean.sed है:

s/\",\"/XXX/g; 
:a 
s/,//g 
ta 
s/XXX/\",\"/g; 

तो यह अस्थायी फ़ाइलें और वाइला हम चाहते हैं कि शब्द "उद्धरण" है कि हम अपने अन्य प्रक्रियाओं के लिए उपयोग कर सकते हैं के साथ शुरू होता है एक नई फ़ाइल को हटा।

मेरा प्रश्न है:
मुझे उस temp फ़ाइल में फेफ टैग को हटाने के लिए एक sed स्टेटमेंट क्यों करना है? मूल फ़ाइल में यह नहीं है, लेकिन यह हमेशा प्रतिस्थापन में दिखाई देता है। पहले मैंने सोचा था कि सीपी इसका कारण बन रहा था, लेकिन अगर मैं सीपी से पहले हटाने के लिए sed स्टेटमेंट डालता हूं, तो यह वहां नहीं है।

कुछ हो सकता है कि मैं सिर्फ याद कर रहा हूँ ...

+0

कृपया 'clean.sed' के लिए स्रोत पोस्ट करें। कौन सी .tmpX फाइलें पहले फेफ में दिखाई देती हैं? – wallyk

+2

0xfeff यूनिकोड बाइट ऑर्डर चिह्न है। सुनिश्चित नहीं है कि यह आपके मामले में क्या जोड़ता है। – Eugene

+2

पहला प्रश्न: आप प्रत्येक जगह $ 1.1st पर इन-प्लेस (sed -i) का उपयोग करने के बजाय ऐसा करने के लिए 4 temp फ़ाइलों को क्यों बनाते हैं? दूसरा: बाइट ऑर्डर मार्कर (फेफ) आपकी प्रक्रिया में कब दिखता है? Clean.sed चलाने के तुरंत बाद क्या यह है? यदि ऐसा है, तो आप उस स्क्रिप्ट को पोस्ट करना चाहेंगे। तीसरा [नाइटपिक]: जब आप सिंगल कोट्स के अंदर होते हैं तो आपको डबल कोट्स से बचने की आवश्यकता नहीं होती है, और आपको कॉमा से बचने की आवश्यकता नहीं होती है। एस /,/","/g '' s/\,/\ "\, \"/g 'से बहुत अधिक पठनीय है। – glomad

उत्तर

15

U + FEFF एक byte order mark के लिए कोड है। आपकी फाइलों में सबसे अधिक संभावना है कि यूटीएफ -16 में सहेजा गया डेटा और बीओएम आपकी 'सफाई प्रक्रिया' से दूषित हो गया है, जो कि एएससीआईआई की अपेक्षा सबसे अधिक संभावना है। शायद बीओएम को हटाने का अच्छा विचार नहीं है, बल्कि अपनी स्क्रिप्ट को ठीक करने के लिए इसे पहले स्थान पर भ्रष्ट करने के बजाय।

+0

यही मैंने सोचा था, लेकिन वह स्पष्ट रूप से इस सवाल में बताता है कि बीओएम मूल फ़ाइल में नहीं है। – glomad

+0

एक बीओएम अदृश्य है। प्रश्न में दी गई जानकारी को देखते हुए मेरा सबसे अच्छा अनुमान यह है कि clean.sed स्क्रिप्ट उनके हेक्स प्रस्तुति के लिए अप्रचलित पात्रों को बदलती है, और संभवतः एनयूएल अक्षरों को भी हटा देती है। तो बीओएम शायद वहां सब कुछ था, यह बस और दिखाई देता है "सफाई" के बाद। –

+0

यहां clean.sed है: एस/\ ", \"/XXX/जी; : एस /, // जी टा एस/XXX/\ ", \"/जी; – SDGuero

2

जीएनयू Emacs में इनमें से छुटकारा पाने के लिए:

  1. ओपन Emacs
  2. प्रमुख तीन बाइट्स
  3. सहेजें फ़ाइल बंद फ़ाइल
  4. संपादित खोलने के लिए एक खोज-फ़ाइल-सचमुच क्या

डीओएस लाइन समाप्ति सम्मेलन के साथ फ़ाइलों को यूनिक्स लाइन समाप्ति सम्मेलन में परिवर्तित करने का एक तरीका भी है।

+0

Emacs 'C-x RET f' में और 'utf-8' निर्दिष्ट करें –

संबंधित मुद्दे