2010-01-23 20 views
127

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

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

[^\x00-\x7F] 

यह एक वैध PCRE (पर्ल संगत नियमित अभिव्यक्ति) है:

+2

perl स्थापित है? –

+1

पॉल, हाँ, मैं perl – Rory

उत्तर

221

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

तुम भी POSIX shorthands उपयोग कर सकते हैं:

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

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

+0

का उपयोग कर सकता हूं, इसका मतलब यह नहीं है [~ \ x20- \ x7f] – adrianm

+2

@adrianm: नहीं, '^' पीसीआरई में मान्य है। –

+10

यह बिल्कुल सही है। हालांकि आपको pcregrep का उपयोग करना है, मानक grep नहीं। [^ [: प्रिंट:]] यूटीएफ 8 में आपका टर्मिनल स्थापित होने पर काम नहीं करेगा। – Rory

4

आप इस पृष्ठ की जाँच करने के सकता है: Unicode Regular Expressions, के रूप में यह की तरह, कुछ उपयोगी यूनिकोड वर्ण वर्गों में शामिल हैं: आप वास्तव में एक regex की जरूरत नहीं है

\p{Control}: an ASCII 0x00..0x1F or Latin-1 0x80..0x9F control character.
+0

[मानक grep उन का समर्थन नहीं करता] [https://www.gnu.org/software/grep/manual/grep.html)। – eis

1

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

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

यदि आपके पास कोई मिलान करने वाली फ़ाइलें नहीं हैं, तो ग्लोब कुछ भी नहीं बढ़ेगा।

+1

विचित्र रूप से, यह बैश में सही ढंग से काम नहीं करता है। – tripleee

26

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

[^\x00-\x7F] 

अन्यथा, यह बाहर नई-पंक्तियों और अन्य विशेष वर्ण कि ASCII तालिका का हिस्सा हैं ट्रिम जाएगा:

यह वास्तविक ASCII है! ,

[^\w \xC0-\xFF] 

प्रकरण पूछना विकल्पों बहुपंक्ति है:

0

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

1

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

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