करता है (चाहिए) LC_COLLATE वर्ण श्रेणियों को प्रभावित करता है?


27

LC_COLLATEपरिभाषित करने के माध्यम से टकराव का क्रम न केवल व्यक्तिगत वर्णों का क्रमबद्ध क्रम है, बल्कि वर्ण श्रेणियों का अर्थ भी है। या करता है? निम्नलिखित स्निपेट पर विचार करें:

unset LANGUAGE LC_ALL
echo B | LC_COLLATE=en_US grep '[a-z]'

Intuitively, Bमें नहीं है [a-z], तो यह नहीं करना चाहिए उत्पादन कुछ भी। उबंटू 8.04 या 10.04 पर यही होता है। लेकिन डेबियन लेनी या निचोड़ चल कुछ मशीनों पर, Bपाया क्योंकि रेंज है a-zसब कुछ के बीच है कि शामिल है aऔर zबड़े अक्षरों सहित मिलान के क्रम में Bके माध्यम से Z

परीक्षण किए गए सभी सिस्टमों में en_USजनरेट किया गया स्थान होता है। मैंने लोकेल को अलग-अलग करने की भी कोशिश की: जिन मशीनों में Bऊपर से मिलान किया गया है, वही {en_{AU,CA,GB,IE,US},fr_FR,it_IT,es_ES,de_DE}{iso8859-1,iso8859-15,utf-8}जापानी (किसी भी उपलब्ध एन्कोडिंग में) और C/ को छोड़कर हर उपलब्ध लोकेल (ज्यादातर लैटिन-आधारित:, चीनी स्थान) में भी होता है POSIX

जब आप ASCII से आगे जाते हैं, तो नियमित अभिव्यक्ति में चरित्र श्रेणियों का क्या मतलब है ? एक ओर कुछ डेबियन इंस्टॉलेशन और दूसरी ओर अन्य डेबियन इंस्टॉलेशन और उबंटू में अंतर क्यों है? अन्य प्रणालियाँ कैसे व्यवहार करती हैं? कौन सही है, और किसके खिलाफ बग की रिपोर्ट होनी चाहिए?

(ध्यान दें कि मैं विशेष रूप [a-z]से en_USस्थानों में चरित्र श्रेणियों के व्यवहार के बारे में पूछ रहा हूं , मुख्य रूप से GNU libc- आधारित प्रणालियों पर। मैं यह नहीं पूछ रहा हूं कि लोअरकेस अक्षर या ASCII लोअरकेस अक्षरों का मिलान कैसे किया जाए।)


दो डेबियन मशीनों पर, एक जहाँ Bमें है [a-z]और एक जहाँ यह नहीं है, का आउटपुट LC_COLLATE=en_US locale -k LC_COLLATEहै

collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=1
collate-codeset="ISO-8859-1"

और का आउटपुट LC_COLLATE=en_US.utf8 locale -k LC_COLLATEहै

collate-nrules=4
collate-rulesets=""
collate-symb-hash-sizemb=2039
collate-codeset="UTF-8"

1
एक डेबियन लेनी उदाहरण पर पुन: पेश नहीं करता जो मैंने काम किया था। अगर en_USउत्पन्न होता है, तो जाँच न करें ।
एलेक्स

1
@alex यदि लोकल जेनरेट नहीं होता है, तो Cलोकेल को फॉलबैक के रूप में उपयोग किया जाता है, और इसके कॉलेशन ऑर्डर सीधे बाइट मान हैं, इसलिए Bइसका मिलान नहीं किया जाएगा। के उत्पादन में दिखाई देने वाले लोकल में टेस्ट करें locale -a
गिल्स एसओ- बुराई को रोकना '

1
ध्यान दें कि en_US en_US.utf8 के समान नहीं है, और आमतौर पर इसका मतलब है en_US.iso-8859-1, वास्तव में आपके द्वारा इंस्टॉल किए गए पर निर्भर करता है। यदि en_US (कोई प्रत्यय के साथ) लोकेल के आउटपुट में प्रकट नहीं होता है, तो आपको वास्तव में यह लोकेल नहीं मिलता है। LC_COLLATE = en_US लोकेल -k LC_COLLATE क्या दिखाता है?
नील मैय्यूज


1
@ आईसैक दुर्भाग्य से, 7 साल बाद, मुझे लगता है कि किसी भी समस्याग्रस्त प्रणाली तक पहुंच नहीं है। वे सभी अपग्रेड हो गए हैं या डिमोशन हो गए हैं।
गिल्स एसओ- बुराई को रोकना

जवाबों:


3

यदि आप Cलोकेल के अलावा किसी और चीज का उपयोग कर रहे हैं , तो आपको रेंज का उपयोग नहीं करना चाहिए [a-z]क्योंकि ये लोकेल-डिपेंडेंट होते हैं और हमेशा वे परिणाम नहीं देते हैं जिनकी आपको उम्मीद होती है। साथ ही आपके द्वारा पहले से सामना किए गए केस का मुद्दा, कुछ स्थान वर्णक (जैसे á ) वर्णों को आधार वर्ण (यानी a ) के समान मानते हैं ।

इसके बजाय, एक नामित वर्ण वर्ग का उपयोग करें:

echo B | grep '[[:lower:]]'

यह हमेशा लोकेल के लिए सही परिणाम देगा। हालाँकि, आपको अपने इनपुट टेक्स्ट और जिस परीक्षण को लागू करने का प्रयास कर रहे हैं, उसके अर्थ को दर्शाने के लिए आपको लोकेल को चुनना होगा।

उदाहरण के लिए, यदि आपको किसी विशेष बाइट मान को खोजने की आवश्यकता है, तो Cलोकेल का उपयोग करें , जो हमेशा उपलब्ध है:

echo B | LANG=C grep '[a-z]'

यदि यह उम्मीद के मुताबिक काम नहीं करता है, तो यह वास्तव में एक बग है।


मुझे पता है कि, यह वह नहीं है जो मैंने पूछा था। मैं विशेष रूप से इस बारे में पूछ रहा हूं कि एक स्पष्ट सीमा का क्या मतलब है, और क्यों अलग-अलग वितरण (यहां तक ​​कि जीएनयू लिबेक और जीएनयू ग्रीप के साथ) अलग-अलग व्यवहार हैं। (अपमानित क्योंकि आप जो कहते हैं वह सही है, यह अप्रासंगिक है।)
गाइल्स का SO- बुराई करना बंद करो '

1
मेरा कहना है कि एक स्पष्ट सीमा का अर्थ स्थानीय-निर्भर है, और विभिन्न प्रणालियों को अपने स्थानों को उसी तरह परिभाषित करने की आवश्यकता नहीं है, इसलिए यह बग नहीं है। तकनीकी रूप से, आप सिस्टम का दुरुपयोग कर रहे हैं, इसलिए आपको "अपरिभाषित" व्यवहार प्राप्त करने पर आश्चर्य नहीं होना चाहिए। साथ ही, कई लोगों ने टिप्पणी की है कि वे अपने डेबियन सिस्टम पर व्यवहार को पुन: पेश नहीं कर सकते हैं, इसलिए आपके सिस्टम के बारे में कुछ असामान्य प्रतीत होता है।
नील मैय्यू

1
मुझे पता है कि सीमाओं का व्यवहार स्थानों पर निर्भर करता है। मैं पूछ रहा हूं कि कैसे, और आश्चर्यचकित हूं कि ग्लिबक (और, यह एक ही डेबियन रिलीज की अलग-अलग स्थापनाएं) का उपयोग करके अलग-अलग प्रणालियां अलग-अलग व्यवहार करती हैं। मैंने locale -kअपने प्रश्न का आउटपुट जोड़ा है ; यह दो डेबियन मशीनों पर समान है, एक जहां Bसीमा में है और एक जहां यह नहीं है। BTW मैं किसी भी मशीन पर रूट नहीं कर रहा हूं (इसलिए यह कुछ अजीब नहीं है जो मैं एक व्यवस्थापक के रूप में करता हूं)।
गिल्स एसओ- बुराई को रोकना '

echo "Baü" | LC_COLLATE=C grep -o '[[:lower:]]'रिटर्न aऔर üजबकि echo "Baü" | LC_COLLATE=C grep -o '[a-z]'रिटर्न केवल a। मेरी नजर में "लोअर" वास्तव में वह नहीं है जो ओपी चाहता था
डैनियल एल्डर

मेरा मूल बिंदु अभी भी खड़ा है, हालांकि: जब तक आप Cलोकेल में नहीं होते तब तक रेंज का उपयोग न करें । मेरा मानना ​​है कि यह ओपी के लिए प्रासंगिक है, जो बग की रिपोर्ट करना चाहता था। यदि आप Cलोकेल में नहीं हैं , तो पर्वतमाला का उपयोग करने के परिणाम बहुत अप्रत्याशित हैं और इसलिए इसे कभी भी बग नहीं माना जा सकता है। दूसरी ओर, यदि आपको किसी विशेष बाइट मान को खोजने की आवश्यकता है, तो बस Cलोकेल का उपयोग करें । मेरा द्वितीयक बिंदु यह था कि यदि आप वास्तव में लोकेट में अक्षरों को खोजना चाहते हैं, तो चरित्र वर्ग का उपयोग करें। भले ही ओपी इस की तलाश नहीं कर रहे हों, दूसरों को यह सवाल मिल सकता है।
नील मैय्यूज

1

नियमित अभिव्यक्तियों में रंगों को कोलाज सेटिंग का निरीक्षण करना चाहिए। यहाँ प्रासंगिक मानक है: http://pubs.opengroup.org/onlinepubs/007908799/xbd/re.html ("श्रेणी के भाव देखें")। इसलिए echo B | LC_COLLATE=en_US grep '[a-z]'आउटपुट Bको संबंधित लोकेल की एक समझदार परिभाषा दी जानी चाहिए । मैं समझा नहीं सकता कि यह कभी-कभी आपके लिए काम क्यों नहीं करता है, लेकिन मुझे बहुत आश्चर्य होगा अगर मैंने इसे एक गैर-प्राचीन प्रणाली पर सामना किया जो ठीक से स्थापित और कॉन्फ़िगर किया गया है।


1
echo B | LC_COLLATE=en_US.utf8 grep '[a-z]' Grep 2.10 के साथ Ubuntu 12.04 पर कुछ भी प्रिंट नहीं करता है। Centre 6.5 पर grep 2.6.3 के साथ कुछ भी प्रिंट नहीं करता है। डेब्रे 6.0.8 के साथ डेबियन 6.0.8 पर काम करता है।
इयान डी। एलन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.