tr: ASCII में एपोस्ट्रोफ को रूपांतरित करें


11

मैं एक सही एकल उद्धरण चिह्न को एपोस्ट्रोफ का उपयोग करके परिवर्तित करने की कोशिश कर रहा हूं tr

tr "`echo -e '\xE2\x80\x99'`" "`echo -e '\x27'`" < a > b

एक UTF-8 एन्कोडेड फ़ाइल दी गई है aजिसमें यह उदाहरण है:

Were not a different species
All alone?” Jeth mentioned.

ओएस एक्स बीएसडी का उपयोग करता है trऔर एक अच्छा परिणाम उत्पन्न करता है:

We're not a different species
“All alone?” Jeth mentioned.

उबुन्टु GNU का उपयोग करता है trऔर इस बुरे परिणाम का उत्पादन करता है:

We'''re not a different species
''<9C>All alone?''<9D> Jeth mentioned.

मैं उबंटू में इस रूपांतरण को कैसे पूरा कर सकता हूं?


यह भी आज़माया गया: समान परिणाम वाले tr $ '\ xE2 \ x80 \ x99' $ '\ x27' <a।
प्लामट्रू


2
echo It’s easy | perl -CS -Mutf8 -pe "tr/’/'/"
14

जवाबों:


16

आप कुछ अन्य उपकरण आज़मा सकते हैं, जैसे sed:

$ sed "s/’/'/g" <a
We're not a different species
“All alone?” Jeth mentioned.

या, चूंकि हम सरल अनुवाद कर रहे हैं, इसके लिए yकमांड का उपयोग करें sed:

$ sed "y/’/'/" <a
We're not a different species
“All alone?” Jeth mentioned.

GNUtr संभवतः इसलिए काम नहीं करता है:

वर्तमान में trपूरी तरह से केवल एकल-बाइट वर्णों का समर्थन करता है। आखिरकार यह मल्टीबाइट पात्रों का समर्थन करेगा; जब यह होता है, तो -C विकल्प इसे वर्णों के समुच्चय के पूरक का -c कारण बनेगा , जबकि यह मानों के समुच्चय को पूरक करेगा। यह अंतर तभी मायने रखेगा जब कुछ मान वर्ण न हों, और यह केवल उन स्थानों पर बहुबिंदीय एन्कोडिंग का उपयोग करके संभव है जब इनपुट में एन्कोडिंग त्रुटियां होती हैं।

और एक बहु चरित्र है:

$ echo -n \' | wc -c
1
$ echo -n  | wc -c  
3

1
sedइस तरह के काम के लिए बहुत अच्छा है।
काज वोल्फ

2
आगे के अंतिम भाग को समझाने के लिए: trतीन बाइट्स में से प्रत्येक को अलग-अलग बदल रहा है ', इसलिए '''साथ ही टूटे हुए अनुक्रम भी हैं जहां यह तीन बाइट्स में से दो को समान वर्णों में बदल दिया है और । इसके बजाय तीन बाइट्स को एक साथ एक चरित्र का अर्थ समझना चाहिए, और इसके बजाय इसे प्रतिस्थापित करना चाहिए।
डेल्टैब

अच्छी समझ के लिए एक मल्टीबैट चरित्र है, हम tr -c '[:print:][:cntrl:]' '-'कमांड का उपयोग प्रत्येक गैर-मुद्रण चरित्र को बदलने के लिए कर सकते हैं , मान्य नियंत्रण वर्णों के अलावा, एक के साथ -। और आपको अक्षरों के 3 बाइट्स जैसे एकल अनुवाद दिखाई देंगे ---। मल्टी-बाइट चरित्र के लिए अच्छा बिंदु।
α atsнιη

9

यदि आप भी दोहरे उद्धरण चिह्नों और शायद अन्य वर्णों को परिवर्तित करना चाहते हैं, तो आप GNU काiconv उपयोग कर सकते हैं :

$ iconv -f utf-8 -t ascii//translit < a
We're not a different species
"All alone?" Jeth mentioned.

//TRANSLITप्रत्यय बताता है iconvकि लक्ष्य एन्कोडिंग (यहाँ ASCII) की प्रदर्शनों की सूची के बाहर पात्रों के लिए, यह समान दिखने वाले अक्षरों या दृश्यों स्वचालित रूप से स्थानापन्न कर सकते हैं। प्रत्यय के बिना, iconvएक अजेय चरित्र का पता लगते ही हार मान लेंगे।

ध्यान दें कि //TRANSLITएक GNU एक्सटेंशन लगता है: POSIXiconv इसका समर्थन नहीं करता है।


+1। यदि आप किसी पाठ को एक वर्ण सेट (या एन्कोडिंग) से दूसरे में परिवर्तित कर रहे हैं, तो उस उद्देश्य के लिए डिज़ाइन किए गए टूल का उपयोग करना समझदार हो सकता है।
RedGrittyBrick

@deltab आपका समाधान दोहरे उद्धरण चिह्नों को भी बदलता है जो ओपी उन्हें प्रतिस्थापित नहीं करना चाहते हैं।
α atsнιη

@ कासिया शायद उन्हें चाहिए।
गुरू

3

आप इनमें से किसी एक awkसमाधान का उपयोग कर सकते हैं:

awk '{gsub(/\xE2\x80\x99/, "\x27");print}' file # with Hex ASCII code

awk '{gsub(/’/, "\x27");print}' file

awk '{gsub(/\342\200\231/, "\47");print}'  file # with Octal ASCII code

awk '{gsub(/’/, "\47");print}' file

या

awk '{gsub(/’/, "'"'"'");print}' file

0

के -sविकल्प का उपयोग करें tr :

$ echo "We’re not a different species"|tr -s "’" "'"
We're not a different species

से man tr :

--truncate-set1
          first truncate SET1 to length of SET2

1
आपका समाधान दोहरे उद्धरण चिह्नों की जगह लेता है जो ओपी उन्हें बदलना नहीं चाहते हैं
αнsнιη

आह, वास्तव में, यह इंगित करने के लिए धन्यवाद। मैं इस उत्तर को संदर्भ के लिए छोड़ दूंगा।
स्किप्पी ले ग्रैंड गौरू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.