2011-07-23 9 views
7

मैं कुछ हर रोज grepping कर रहा था और अचानक पता चला कि कुछ मालूम होता है तुच्छ काम नहीं करता:लोकेल से स्वतंत्र grep [ए-जेड] कैसे बनाया जाए?

$ echo T | grep [A-Z] 

कोई मैच।

टी कैसे ए-जेड रेंज के भीतर नहीं है?

$ echo T | grep [A-Y] 

एक मैच:

मैं regex एक छोटा सा बदल गया है!

वाह! ए-वाई के भीतर टी कैसे है लेकिन ए-जेड के भीतर नहीं है? ABCDEFGHIJKLMNOPQRSŠZŽTUVWÕÄÖÜXY

$ echo $LANG 
et_EE.UTF-8 

यह सभी के लिए एक आघात का एक सा रूप में आया था:

जाहिर है इस वजह से मेरी पर्यावरण एस्टोनियाई स्थान के लिए सेट कर दिया जाता है, जहां वाई वर्णमाला के अंत में है, लेकिन जेड बीच में कहीं है मुझे। 99% समय मैं कंप्यूटर कोड grep, एस्टोनियाई साहित्य नहीं। क्या मैं हर समय गलत तरीके से grep का उपयोग कर रहा हूं? अतीत में इस तरह की सभी गलतियों के कारण मैंने क्या किया है?

निम्नलिखित समाधान में कई बातें मैं आ कोशिश के बाद:

$ echo T | LANG=C grep [A-Z] 

इस ग्रेप स्थान-स्वतंत्र बनाने की सलाह दी रास्ता नहीं है?

आगे पढ़ें ... ऐसा एक उपनाम परिभाषित करने के लिए सुरक्षित होगा:

$ alias grep="LANG=C grep" 

पी एस। मैं भी क्यों चरित्र हैं की सोच रहा हूँ [A-Z] स्थान की तरह पहली जगह में निर्भर पर्वतमाला जबकि \w स्थान से अप्रभावित होने के लिए (हालांकि पुस्तिका का कहना है \w[[:alnum:]] के बराबर है लगता है - लेकिन मुझे पता चला उत्तरार्द्ध स्थान पर निर्भर करता है, जबकि \w नहीं करता)।

+0

कि फिर से सभी का प्रयास करें, लेकिन अपने अभिव्यक्ति 'ग्रेप '[A-Z]'' बोली, बस सुनिश्चित खोल कि विस्तार हो रहा नहीं है बनाने के लिए। – Mat

+0

उद्धरण के साथ और बिना मेरे लिए बिल्कुल वही काम करता है। –

+0

वही काम करता है क्योंकि आपके पास ए के माध्यम से ए फ़ाइल नाम नहीं है। खोल ने [ए-जेड] का विस्तार करने की कोशिश की, कुछ भी नहीं मिला, और इसे अकेला छोड़ दिया। हमेशा grep के लिए पैटर्न पास करने के लिए उद्धरण का प्रयोग करें। – Gilbert

उत्तर

5

पॉज़िक्स नियमित अभिव्यक्ति, जो कि लिनक्स और फ्रीबीएसडी grep स्वाभाविक रूप से समर्थन करते हैं, और कुछ अन्य अनुरोध पर समर्थन करते हैं, [: xxx:] पैटर्न की एक श्रृंखला है जो स्थानीय लोगों का सम्मान करती है। विवरण के लिए मैन पेज देखें।

 grep '[[:upper:]]'

के रूप में [] रों पैटर्न के नाम का हिस्सा आप बाहरी [] के साथ-साथ, की परवाह किए बिना कैसे अजीब यह लग रहा है की जरूरत है।

इन के आगमन के साथ

: कोड क्लासिक \ w, आदि, सी स्थान में सख्ती से रहते हैं। इस प्रकार पैटर्न की आपकी पसंद निर्धारित करती है कि क्या grep वर्तमान लोकेल का उपयोग करता है या नहीं।

[A-Z] स्थान का पालन करना चाहिए, लेकिन आप LC_ALL बल्कि LANG से स्थापित करने के लिए, सिस्टम आपके लिए एक अलग मान को LC_ALL सेट खासकर यदि आवश्यकता हो सकती है।

+0

तो आप कहते हैं [ए-जेड] सी लोकेल में सख्ती से बनी हुई है? लेकिन मेरा पूरा सवाल सी लोकेल में नहीं था। –

+0

LANG के बजाय LC_ALL पर्यावरण चर सेट करने का प्रयास करें। – Gilbert

+0

एलसी_ओएल शायद LANG की तुलना में उपयोग करने के लिए एक बेहतर चर है क्योंकि यह पहले के लिए grep चेक है। लेकिन वर्तमान में यह मेरे लिए कोई फर्क नहीं पड़ता है। –

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