`Grep` में हेक्साडेसिमल कोड का उपयोग करके वर्णों को कैसे निर्दिष्ट करें?


27

मैं हेक्साडेसिमल कोड 0900 (ए के बजाय) से 097 एफ (वी के बजाय) के लिए जीआरपी चरित्र सेट रेंज के लिए निम्नलिखित कमांड का उपयोग कर रहा हूं। अ और व के स्थान पर मैं हेक्साडेसिमल कोड का उपयोग कैसे कर सकता हूं?

bzcat archive.bz2 | grep -v '<[अ-व]*\s' | tr '[:punct:][:blank:][:digit:]' '\n' | uniq | grep -o '^[अ-व]*$' | sort -f | uniq -c | sort -nr | head -50000 | awk '{print "<w f=\""$1"\">"$2"</w>"}' > hindi.xml

मुझे निम्न आउटपुट मिले:

    <w f="399651">और</w>
    <w f="264423">एक</w>
    <w f="213707">पर</w>
    <w f="74728">कर</w>
    <w f="44281">तक</w>
    <w f="35125">कई</w>
    <w f="26628">द</w>
    <w f="23981">इन</w>
    <w f="22861">जब</w> 
    ...

मैं सिर्फ उपरोक्त कमांड में अ और व के बजाय हेक्साडेसिमल कोड का उपयोग करना चाहता हूं।

यदि हेक्साडेसिमल कोड का उपयोग करना संभव नहीं है, तो क्या मैं चरित्र सेट ('अ-व') के लिए हेक्साडेसिमल कोड के बजाय यूनिकोड का उपयोग कर सकता हूं?

मैं Ubuntu 10.04 का उपयोग कर रहा हूं


1
आपका क्या मतलब है "काम नहीं"? साथ -vही मैच का विरोध करता है, आपके प्रश्न पाठ से ऐसा लगता है कि वह नहीं है जो आप चाहते हैं।
क्रिश्चियन.के।

@ Christian.K देरी के लिए क्षमा करें ... मैंने प्रश्न संपादित किया है, कृपया देखें।

मैं अभी भी एक उचित उत्तर की प्रतीक्षा कर रहा हूं। :(
ध्रूबो भट्टाचार्जी

जवाबों:


21

इस प्रश्न को देखो ।

टेक्स्ट आमतौर पर UTF-8 में एन्कोडेड होता है; इसलिए आपको utf-8 एन्कोडिंग में उपयोग किए जाने वाले बाइट्स के हेक्स वैल्स का उपयोग करना होगा।

grep "["$'\xe0\xa4\x85'"-"$'\xe0\xa4\xb5'"]"

तथा

grep '[अ-व]'

समतुल्य हैं, और वे एक लोकेल-आधारित मिलान करते हैं (अर्थात मिलान देवनागरी लिपि के छंटनी के नियमों पर निर्भर है (अर्थात, मिलान "\ u0905 और \ _ 0935 के बीच कोई चार नहीं है ") लेकिन इसके बजाय "देवनागरी के बीच कुछ भी" A और देवनागरी VA "; मतभेद हो सकते हैं।

दूसरी ओर, आपके पास यह है (नोट -२):

grep -P "\xe0\xa4[\x85-\xb5]"

उन बाइट मूल्यों के साथ एक द्विआधारी मिलान करेगा ।


2
कृपया उपसर्ग "["$'और प्रत्यय की व्याख्या करें"]"
जोनाथन कोमार

6

यदि शेल बचना पर्याप्त है तो आप $'\xHH'इस तरह से वाक्य रचना का उपयोग कर सकते हैं :

grep -v "<["$'\x09\x00'"-"$'\x09\x7F'"]*\s"

क्या यह आपके उपयोग के मामले के लिए पर्याप्त है?


echo 'अ-व' | hdमुझे देता हैe0 a4 85 - e0 a4 b5
enzotib

वास्तव में ओपी ने यूनिकएफ -8 एनकोडिंग में हेक्साडेसिमल डंप नहीं, बल्कि यूनिकोड मान दिया: - / जब grepसे किसी भी लिब के साथ जुड़ा नहीं है, मुझे लगता है कि रेंज रूपांतरण को grep द्वारा किया जाना संभव नहीं है: - /
स्टीफन गिनीमेज

1
Btw, zshव्याख्या करने में सक्षम है "\u0900"और "\u097F", लेकिन व्यवहार UTF-8 एन्कोडेड रेंज निरंतर होने पर निर्भर करेगा (शायद यह है)।
स्टेफेन जिमेनेज़

कोई grep -v "<" "$ '\ x09 \ x00'" - "$ '\ x09 \ x7F'"] * \ _ "निम्नलिखित आउटपुट देता है <wf =" 16929 "> x </ w> <wf =" 10995 "> F </ w> <wf =" 2548 "> FF </ w> <wf =" 762 "> FFFFFF </ w> <wf =" 655 "> FFFF </ w> <wf =" 266 " > xx </ w> <wf = "215"> FFF </ w> <wf = "117"> xxx </ w> .... यह अपेक्षित नहीं है। :(, क्या मैं हेक्साडेसिमल कोड या कैरेक्टर सेट ('अ-व') के बजाय यूनिकोड का उपयोग कर सकता हूं?
ध्रूबो भट्टाचार्जी

6

0x0900आपके द्वारा लिखा गया "हेक्साडेसिमल" मूल्य UNICODE कोड बिंदु का मूल्य है जो हेक्साडेसिमल में भी है।

हेक्साडेसिमल कोड 0900 (एक के बजाय)

मेरा मानना ​​है कि आपके कहने का मतलब हेक्साडेसिमल यूनिकोड कोड बिंदु है U0905:।

यू-0900 पर चरित्र एक आप का उपयोग नहीं किया है:
वह पात्र U0905 है , जो इस यूनिकोड पृष्ठ का हिस्सा है , या इस पृष्ठ पर सूचीबद्ध है ।

में bash(डिफ़ॉल्ट रूप से उबंटू में स्थापित), या सीधे कार्यक्रम के साथ: /usr/bin/printf(लेकिन shप्रिंटफ के साथ नहीं ), एक यूनिकोड वर्ण के साथ उत्पादन किया जा सकता है:

$ printf '\u0905'

$ /usr/bin/printf '\u0905'

हालाँकि, वह वर्ण, जो एक कोड बिंदु संख्या से आता है, को कई बाइट धाराओं द्वारा दर्शाया जा सकता है, जिसके आधार पर कोड पृष्ठ का उपयोग किया जाता है।
यह स्पष्ट होना चाहिए कि \U0905है 0x09 0x05UTF-16 (यूसीएस -2, आदि) में
और 0x00 0x00 0x09 0x05UTF-32 में।
यह स्पष्ट नहीं हो सकता है, लेकिन utf-8 में इसका प्रतिनिधित्व किया जाता है 0xe0 0xa4 0x85:

$ /usr/bin/printf '\u0905' | od -vAn -tx1
e0 a4 85

यदि आपके कंसोल का स्थान कुछ इसी तरह का है en_US.UTF-8

और मैं शेल के बारे में बात कर रहा हूं क्योंकि यह वह है जो एक स्ट्रिंग को एप्लिकेशन को प्राप्त करने में बदल देता है। यह:

grep "$(printf '\u0905')" file

grep को आपके द्वारा आवश्यक चरित्र को "देखना" पड़ता है।
ऊपर की लाइन को समझने के लिए आप इको का उपयोग कर सकते हैं:

$ echo grep "$(printf '\u0905')" file
grep  file

फिर, हम एक चरित्र श्रेणी का निर्माण कर सकते हैं, जैसा कि आप अनुरोध करते हैं:

$ echo grep "$(printf '[\u0905-\u097f]')" file
grep [अ-ॿ] file

जो आपके प्रश्न का उत्तर दे:

अ और व के स्थान पर मैं हेक्साडेसिमल कोड का उपयोग कैसे कर सकता हूं?


यह अब तक का सबसे अच्छा जवाब है --- यह खोल में यूनिकोड बिंदुओं के अभ्यावेदन के मुद्दे को स्पष्ट रूप से संबोधित करता है और दिखाता है कि उनके बीच हेक्स कोड कैसे आगे और पीछे जाना है।
स्टेफानो

2

हम गैर-आस्की ओपन डबल कोट्स और क्लोज डबल कोट्स को रेगुलर डबल कोट्स (") में बदलना चाहते थे। नॉन-एससीआई सिंगल कोट को रेगुलर सिंगल कोट (') भी।

उन्हें फ़ाइल में देखने के लिए (ubuntu bash शेल):

$ grep -P "\x92" infile.txt  (single)
$ grep -P "\x93" infile.txt  (open double)
$ grep -P "\x94" infile.txt  (close double)

उनका अनुवाद करें:

$ /bin/sed "s/\x92/'/g" a.txt > b.txt
$ /bin/sed 's/\x93/"/g' b.txt > c.txt
$ /bin/sed 's/\x94/"/g' c.txt > d.txt
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.