(grep) गैर-ASCII वर्णों के मिलान के लिए Regex?


169

लिनक्स पर, मेरे पास बहुत सारी फाइलों के साथ एक निर्देशिका है। उनमें से कुछ में गैर-एएससीआईआई अक्षर हैं, लेकिन वे सभी वैध यूटीएफ -8 हैं । एक कार्यक्रम में एक बग होता है जो इसे गैर-एएससीआईआई फ़ाइल नाम के साथ काम करने से रोकता है, और मुझे यह पता लगाना होगा कि कितने प्रभावित हैं। मैं इसके साथ ऐसा करने जा रहा था findऔर फिर गैर- ASCII वर्णों को प्रिंट करने के लिए एक grep करता हूं , और फिर wc -lनंबर खोजने के लिए एक करता हूं । यह grep होना जरूरी नहीं है; मैं किसी भी मानक यूनिक्स नियमित अभिव्यक्ति का उपयोग कर सकता हूं , जैसे पर्ल , sed , AWK , आदि।

हालाँकि, क्या 'किसी भी चरित्र के लिए एक नियमित अभिव्यक्ति है जो ASCII वर्ण नहीं है'?


1
पॉल, हां मैं पर्ल का उपयोग कर सकता हूं
रोरी

/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F]
तिनमोरिनो

जवाबों:


310

यह एक एकल गैर- ASCII चरित्र से मेल खाएगा:

[^\x00-\x7F]

यह एक मान्य पीसीआरई ( पर्ल-कम्पेटिबल रेगुलर एक्सप्रेशन ) है।

आप POSIX शॉर्टहैंड का भी उपयोग कर सकते हैं :

  • [[:ascii:]] - एक ASCII चार से मेल खाता है
  • [^[:ascii:]] - एक एकल गैर- ASCII चार से मेल खाता है

[^[:print:]] शायद आपके लिए पर्याप्त होगा। **


3
@ एड्रियनम: नहीं, पीसीआरई ^में मान्य है।
एलिक्स एक्सल

10
यह बिल्कुल सही है। हालाँकि आपको pcregrep का उपयोग करना है, मानक grep का नहीं। यदि आपका टर्मिनल UTF8 में स्थापित है तो [^ [: प्रिंट:]] काम नहीं करेगा।
रोरी

@ रोरी, :print:UTF8 टर्मिनल में काम क्यों नहीं करेगी? यह मेरे लिए UTF8 टर्मिनल में pry में काम करता है:27.chr =~ /[^[:print:]]/
akostadinov

यह खराब फाइलनामों को ठीक करने के लिए बहुत अच्छा है - rename 's/[^\x00-\x7F]//g' *(आप -nनाम बदलने के लिए उपयोग कर सकते हैं पहले ठीक हैं)।
n

मैं किसी भी चरित्र से कैसे मेल खाता हूं जो गैर-यूटीएफ 8 और किसी अन्य विशिष्ट वर्ण से हो?
CMCDragonkai 10

37

नहीं, [^\x20-\x7E]ASCII नहीं है।

यह वास्तविक ASCII है:

 [^\x00-\x7F]

अन्यथा, यह newlines और अन्य विशेष वर्णों को छाँट देगा जो ASCII तालिका का हिस्सा हैं!


5

आप इस पृष्ठ को भी देख सकते हैं: यूनिकोड रेगुलर एक्सप्रेशंस , क्योंकि इसमें कुछ उपयोगी यूनिकोड वर्ण वर्ग हैं, जैसे:

\ p {नियंत्रण}: एक ASCII 0x00..0x1F या लैटिन -1 0x80..0x9F नियंत्रण चरित्र।


3

[^\x00-\x7F]और [^[:ascii:]]कुछ नियंत्रण बाइट्स को याद करें ताकि तार कभी-कभी बेहतर विकल्प बन सकें। उदाहरण के लिए cat test.torrent | perl -pe 's/[^[:ascii:]]+/\n/g'अपने टर्मिनल के लिए अजीब चीजें करेंगे, जहां जैसा strings test.torrentव्यवहार होगा।


3

पाठ बॉक्स को मान्य करने के लिए Ascii को स्वीकार करें केवल इस पैटर्न का उपयोग करें

[\x00-\x7F]+


3

मैं उपयोग करता हूं [^\t\r\n\x20-\x7E]+और वह ठीक काम कर रहा है।


2

आप इस regex का उपयोग कर सकते हैं:

[^\w \xC0-\xFF]

केस पूछते हैं, विकल्प मल्टीलाइन है


2

तुम सच में एक regex की जरूरत नहीं है

printf "%s\n" *[!\ -~]*

यह उनके नामों में नियंत्रण वर्णों के साथ फ़ाइल नाम दिखाएगा, भी, लेकिन मुझे लगता है कि एक विशेषता है।

यदि आपके पास कोई मेल नहीं है, तो ग्लोब का विस्तार केवल स्वयं तक ही होगा, जब तक कि आपने nullglobसेट न किया हो। (अभिव्यक्ति स्वयं से मेल नहीं खाती है, इसलिए तकनीकी रूप से, यह आउटपुट असंदिग्ध है।)


विश्वास से, मैं देख सकता हूं कि यह सही ढंग से काम करता है यदि आपके पास वास्तव में कुछ फाइलें हैं जो इस पैटर्न से मेल खाती हैं। व्यवहार जहां पैटर्न मैच नहीं होने पर खुद को प्रिंट करता है, थोड़ा आश्चर्य होता है लेकिन वास्तव में सही है। मैंने इसका उत्तर आशा से स्पष्ट करने के लिए संपादित किया।
त्रिकालिका

1

यह बहुत लचीला और एक्स्टेंसिबल निकला। $ क्षेत्र = ~ s / [^ \ x00- \ x7F] // जी; # इस प्रकार प्रश्न में सभी गैर ASCII या विशिष्ट वस्तुओं को साफ किया जा सकता है। बहुत अच्छा या तो चयन या पूर्व-प्रसंस्करण आइटम जो अंततः हैश कुंजी बन जाएगा।

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