वर्ग-ब्रैकेट ग्लोबिंग में केस संवेदनशीलता


10

आम तौर पर, बैश ग्लोबिंग केस संवेदनशील होता है:

$ echo c*
casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py
$ echo C*
CarePackage.md ChocRippleCake.md Clips

वर्ग कोष्ठक का उपयोग करने से यह परिवर्तित नहीं होता है:

$ echo [c]*
casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py
$ echo [C]*
CarePackage.md ChocRippleCake.md Clips

यह अभी भी इसे बदल नहीं है अगर एक हाइफ़न का उपयोग किया जाता है:

$ echo [c-c]*
casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py
$ echo [C-C]*
CarePackage.md ChocRippleCake.md Clips

लेकिन चिट्ठियां लिखी जाती हैं:

$ echo [B-C]*
CarePackage.md casefix.pike cdless chalices.py charconv.py chocolate.pike ChocRippleCake.md circum.py clip.pike Clips cpustats.pike crop.pike cwk2txt.py
$ echo [b-c]*
beehive-anthem.txt bluray2mkv.pike branch branchcleanup.pike burdayim.pike casefix.pike cdless chalices.py charconv.py chocolate.pike circum.py clip.pike cpustats.pike crop.pike cwk2txt.py

इससे पता चलता है कि हाइफ़न एक स्थानीय आदेश का उपयोग कर रहा है, "AaBbCcDd"। इसलिए: क्या सभी फाइलों के लिए ग्लोब करने का कोई तरीका है जो एक बड़े अक्षर से शुरू होता है?


3
यह भी ध्यान रखें कि [AZ] 'z' को छोड़कर प्रत्येक लोअरकेस अक्षर से मेल खाता है!
PJTraill

जवाबों:


12

4.3 और बाद के संस्करण में, एक शॉपट ऑप्शन है globasciiranges:

शॉपइन के अनुसार बिल्ट गन्नू मैन पेज :

globasciiranges
यदि सेट किया जाता है, तो पैटर्न मिलान ब्रैकेट अभिव्यक्तियों में उपयोग की जाने वाली अभिव्यक्तियाँ (पैटर्न मिलान देखें) तुलनात्मक प्रदर्शन करते समय पारंपरिक सी लोकेल में ऐसा व्यवहार करती हैं। यही है, वर्तमान लोकेल के टकराने वाले अनुक्रम को ध्यान में नहीं रखा जाता है, इसलिए 'बी' 'ए' और 'बी' के बीच नहीं टकराएगा, और ऊपरी-केस और लोअर-केस एएससीआईआई अक्षर एक साथ टकराएंगे।

परिणामस्वरूप आप कर सकते हैं

$ shopt -s globasciiranges 
$ echo [A-Z]*

shopt -uअक्षम करने के लिए उपयोग करें ।

एक और तरीका यह है कि लोकेल को सी में बदल दिया जाए। आप इसे एक सबस्क्रिप्शन का उपयोग करके अस्थायी रूप से कर सकते हैं:

$ ( LC_ALL=C ; printf '%s\n' [A-Z]*; )

आपको अपनी आवश्यकता के परिणाम प्राप्त होंगे, और जब उप शेल समाप्त हो जाता है, तो आपके मुख्य शेल का स्थान जो कुछ भी पहले था, अपरिवर्तित रहता है।

एक अन्य विकल्प बश शॉप विकल्प के साथ [A-Z]ब्रेस विस्तार का उपयोग करने के बजाय है ।{A..Z}nullglob

nullglobविकल्प को सक्षम करके , यदि पथनाम विस्तार के दौरान एक पैटर्न का मिलान नहीं किया जाता है, तो पैटर्न के बजाय एक अशक्त स्ट्रिंग वापस आ जाती है।
परिणामस्वरूप यह उम्मीद के मुताबिक काम करेगा:

$ shopt -s nullglob;printf '%s\n' {A..Z}*

2
बहुत बहुत धन्यवाद। मैं उपयोग नहीं कर सकता [[:upper:]]क्योंकि मैं वास्तव में केवल वर्णमाला का हिस्सा चाहता हूं, लेकिन यह काम करता है।
रसूव

1
@rosuav आपका स्वागत है। उप शेल विकल्प की भी जाँच करें।
जॉर्ज वासिलिउ

"यदि सक्षम सी लोकेल के बराबर है" - क्या आपका मतलब यह है कि यह ग्लोबिंग के लिए इस्तेमाल होने वाले लोकेल को प्रभावित करता है और कुछ नहीं? (एक संदर्भ लिंक उपयोगी होता - मुझे जो सबसे अच्छा मिल सकता है वह है gnu.org/software/bash/manual/html_node/Pattern-Matching.html , लेकिन मैंने सभी शेल विकल्पों की एक सूची पसंद की होगी, लेकिन ग्लोबासाइसीरंग गायब है से gnu.org/software/bash/manual/html_node/... , यह भी सवाल unix.stackexchange.com/questions/227070/... हैंडल इस मुद्दे को बड़े पैमाने पर) इसके अलावा संस्करण 4.3 से।।
PJTraill

@PjTrail सभी दुकान विकल्पों के संदर्भ लिंक के साथ मेरा संपादन देखें। इसके अलावा, आप man bashअपने टर्मिनल में चला सकते हैं और /ग्लोबासाइसीरैंग के लिए खोज (उपयोग कर ) कर सकते हैं।
जॉर्ज वासिलिउ

LC_ALL=C printf '%s\n' [A-Z]*आपके दूसरे समाधान के लिए काम नहीं करेगा - बिना सबस्क्रिप्शन के? BTW: वहाँ एक टाइपो है:, nullblogलेकिन यह मेरे लिए इसे सही करने के लिए बहुत कम अक्षर है।
जो

5

आप सभी बड़े अक्षरों को ठीक तरह से लिख सकते हैं:

[ABCDEFGHIJKLMNOPQRSTUVWXYZ]*

या [:upper:]आपके वर्तमान में सभी अपरकेस अक्षरों का प्रतिनिधित्व करने के लिए नामित वर्ण वर्ग का उपयोग कर सकते हैं locale:

[[:upper:]]*

जैसा कि आपने देखा है, [B-C]उसी वर्णमाला के लिए ऊपरी और निचले मामले की तरह सीमा का उपयोग करते समय आसन्न रूप से व्यवस्थित किया जा रहा है (टकराव क्रम के अनुसार locale)।


3

वर्ण श्रेणियों में "अनजाने" वर्णों को शामिल करना, जैसे कि एक सीमा में निचले अक्षरों को शामिल करना, जिनकी सीमाएं अपरकेस अक्षर हैं, LC_COLLATEलोकेल सेटिंग के कारण है । LC_COLLATEसॉर्टिंग ऑर्डर को इंगित करने वाला है, लेकिन यह इसका एक खराब काम करता है (स्ट्रिंग्स को छांटना अधिक जटिल है जो कि लोकेशन क्या कर सकता है) और आप इसके बिना बेहतर हैं। मैं LC_COLLATEआपकी लोकेल सेटिंग से हटाने की सलाह देता हूं । यदि आप कर रहे हैं स्थापित करने LANG, या LANGUAGE, कि ऐसा नहीं करते हैं और केवल लोगों को सेट आप की जरूरत: LC_CTYPE, LC_MESSAGES, LC_TIME

स्थानों के बारे में अधिक जानकारी के लिए, मुझे अपना लोकेल क्या करना चाहिए और ऐसा करने के निहितार्थ क्या हैं? और LC_ * सेट करें, लेकिन LC_ALL नहीं

उपयोगकर्ता की सेटिंग की परवाह किए बिना स्क्रिप्ट में विश्वसनीय परिणाम प्राप्त करने के लिए, सेट करें LC_ALL=C


0

सेट:

shopt -u nocaseglob

बैश मैन पेज से:

>     nocaseglob
>         If  set,  bash matches filenames in a case-insensitive
>         fashion when performing pathname expansion (see Pathname
>          Expansion above).

यदि आप 'ग्लोबसैकिरैंगेस' सेट करते हैं, तो मुझे नहीं पता कि utf-8 जैसे गैर-अस्की पात्रों का क्या होगा


0

गूंज [cC] * आपको वही करना चाहिए जो आप चाहते हैं, इसी तरह [A-Za-z] *

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


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