[A-Z]
bash
सभी मेल खाने वाले तत्वों (वर्ण लेकिन Dsz
हंगेरियन लोकेशन्स जैसे वर्णों का अनुक्रम भी होना चाहिए ) से मेल खाते हैं जो A
पहले और बाद में क्रमबद्ध होते हैं Z
। आपके स्थान पर, c
संभवतः B और C के बीच में है।
$ printf '%s\n' A a á b B c C Ç z Z Ẑ | sort
a
A
á
b
B
c
C
Ç
z
Z
Ẑ
तो c
या z
द्वारा मिलान किया जाएगा [A-Z]
, लेकिन नहीं Ẑ
या नहीं a
।
$ printf '%s\n' A a á b B c C Ç z Z Ẑ |
pipe> bash -c 'while IFS= read -r x; do case $x in [A-Z]) echo "$x"; esac; done'
A
á
b
B
c
C
Ç
z
Z
सी लोकेल में, आदेश होगा:
$ printf '%s\n' A a á b B c C Ç z Z Ẑ | LC_COLLATE=C sort
A
B
C
Z
a
b
c
z
Ç
á
Ẑ
तो [A-Z]
मेल खाएंगे A
, B
, C
, Z
, लेकिन नहीं Ç
है और अभी भी नहीं Ẑ
।
यदि आप ऊपरी-केस अक्षरों (किसी भी स्क्रिप्ट में) पर मिलान करना चाहते हैं, तो आप [[:upper:]]
इसके बजाय उपयोग कर सकते हैं । लैटिन लिपि bash
में केवल अपरकेस अक्षरों से मेल खाने का कोई अंतर्निहित तरीका नहीं है (व्यक्तिगत रूप से सूचीबद्ध करने के अलावा)।
आप मैच के लिए चाहते हैं A
के लिए Z
अंग्रेजी विशेषक बिना पत्र, या तो आप उपयोग कर सकते हैं [A-Z]
या [[:upper:]]
लेकिन में C
स्थान (डेटा संभालने बिग 5 या GB18030 जो कई पात्रों जिसका एन्कोडिंग है जैसे वर्ण सेट में एन्कोड नहीं है शामिल है या सूची उन पत्रों की एन्कोडिंग) उन्हें व्यक्तिगत रूप से ( [ABCDEFGHIJKLMNOPQRSTUVWXYZ]
)।
ध्यान दें कि गोले के बीच कुछ भिन्नता है।
के लिए zsh
, bash -O globasciiranges
(bash-4.3 में विचित्र रूप से नाम दिया गया विकल्प), schily-sh
और yash
, [A-Z]
उन वर्णों से मेल खाता है जिनका कोड बिंदु उसके और उसके बीच A
का है Z
, इसलिए bash
C लोकेल के व्यवहार के बराबर होगा ।
राख, mksh और प्राचीन गोले के लिए, zsh
ऊपर के रूप में, लेकिन एकल-बाइट वर्णमाला तक सीमित। उदाहरण के लिए, UTF-8 लोकेल में, [É-Ź]
मेल नहीं खाएगा Ó
, लेकिन इसके बाद से [<c3><89>-<c5><b9>]
, यह बाइट मान 0x89 से 0xc5 पर मेल करेगा!
ksh93
की तरह बर्ताव करता है bash
सिवाय इसके कि यह विशेष मामलों पर्वतमाला जिसका समाप्त होता है दोनों छोटे अक्षरों या बड़े अक्षरों के साथ शुरू के रूप में व्यवहार करता है। उस मामले में, यह केवल तत्वों का मिलान पर से मेल खाता है उस तरह उन समाप्त होता है, लेकिन बीच में है कि कर रहे हैं (या बहु चरित्र का मिलान तत्वों के लिए अपनी पहली चरित्र) भी लोअरकेस (या अपरकेस क्रमशः)। तो [A-Z]
वहाँ पर से मेल खाएंगे É
, लेकिन पर नहीं e
के रूप में e
के बीच तरह से करता है A
और Z
लेकिन जैसे अपरकेस नहीं है A
और Z
।
के लिए fnmatch()
पैटर्न (के रूप में find -name '[A-Z]'
) या सिस्टम नियमित अभिव्यक्ति (के रूप में grep '[A-Z]'
), यह प्रणाली और स्थान पर निर्भर करता है। उदाहरण के लिए, यहाँ एक GNU सिस्टम [A-Z]
पर x
, en_GB.UTF-8
लोकेल में मेल नहीं खाता है , लेकिन यह th_TH.UTF-8
एक में करता है । यह मेरे लिए स्पष्ट नहीं है कि यह निर्धारित करने के लिए कौन सी जानकारी का उपयोग करता है, लेकिन यह जाहिरा तौर पर LC_COLLATE स्थानीय डेटा से प्राप्त लुकअप तालिका पर आधारित है )।
POSIX द्वारा सभी व्यवहारों की अनुमति दी जाती है क्योंकि POSIX सी लोकेल के अलावा अन्य स्थानों में अनिर्दिष्ट श्रेणियों के व्यवहार को छोड़ देता है। अब हम प्रत्येक दृष्टिकोण के लाभों पर बहस कर सकते हैं।
bash
दृष्टिकोण बहुत समझ में आता है [C-G]
, हम चाहते हैं कि पात्रों के बीच C
और G
। और जो बीच-बीच में निर्धारित करता है, उसके लिए उपयोगकर्ता के क्रमबद्ध आदेश का उपयोग करना सबसे तार्किक दृष्टिकोण है।
अब, समस्या यह है कि यह बहुत से लोगों की अपेक्षाओं को तोड़ता है, विशेष रूप से उन लोगों ने पूर्व-यूनिकोड के पारंपरिक व्यवहार, यहां तक कि पूर्व-अंतर्राष्ट्रीयकरण के दिनों में भी इस्तेमाल किया। जबकि एक सामान्य उपयोगकर्ता से, यह मई अर्थ है कि बनाता है [C-I]
शामिल है h
के रूप में h
पत्र के बीच है C
और I
और कहा कि [A-g]
शामिल नहीं है Z
, यह लोगों को केवल दशकों के लिए ASCII के साथ पेश होने के लिए एक अलग बात है।
वह bash
व्यवहार भी [A-Z]
अन्य GNU टूल्स जैसे कि GNU रेगुलर एक्सप्रेशंस (जैसे grep
/ sed
...) में या के fnmatch()
रूप में मेल खाते रेंज से अलग है find -name
।
इसका अर्थ यह भी है कि [A-Z]
ओएस के साथ और ओएस के संस्करण के साथ पर्यावरण के साथ क्या मेल खाता है। यह तथ्य कि [A-Z]
fact लेकिन Ź से मेल नहीं खाता है, वह भी उप-समरूप है।
के लिए zsh
/ yash
, हम एक अलग छंटाई आदेश का उपयोग करें। चरित्र के आदेश की उपयोगकर्ता की धारणा पर भरोसा करने के बजाय, हम चरित्र बिंदु कोड मूल्यों का उपयोग करते हैं। यह समझने में आसान होने का लाभ है, लेकिन कुछ के व्यावहारिक बिंदु से, एएससीआईआई के बाहर, यह बहुत उपयोगी नहीं है। [A-Z]
26 US-english ऊपरी-केस अक्षरों से [0-9]
मेल खाता है , दशमलव अंकों से मेल खाता है। यूनिकोड में कोड बिंदु हैं जो कुछ वर्णमालाओं के क्रम का पालन करते हैं लेकिन यह सामान्यीकृत नहीं है और इसे सामान्यीकृत नहीं किया जा सकता है क्योंकि वैसे ही एक ही स्क्रिप्ट का उपयोग करने वाले विभिन्न लोग अक्षरों के क्रम पर सहमत नहीं होते हैं।
पारंपरिक गोले और mksh, डैश के लिए, यह टूट गया है (अब ज्यादातर लोग मल्टी-बाइट वर्ण का उपयोग करते हैं), लेकिन मुख्य रूप से क्योंकि उनके पास अभी तक मल्टी-बाइट का समर्थन नहीं है। गोले की तरह बहु-बाइट समर्थन जोड़ना bash
और zsh
एक बड़ा प्रयास रहा है और अभी भी जारी है। yash
(एक जापानी शेल) को शुरू से मल्टी-बाइट समर्थन के साथ डिजाइन किया गया था।
ksh93 के दृष्टिकोण को सिस्टम की नियमित अभिव्यक्तियों या fnmatch () के साथ सुसंगत होने का लाभ है (या कम से कम GNU सिस्टम पर कम से कम दिखाई देता है)। वहाँ, यह कुछ लोगों की अपेक्षाओं को नहीं तोड़ता है के रूप में [A-Z]
छोटे अक्षरों, शामिल नहीं है [A-Z]
शामिल है É
(और एक नहीं, बल्कि z)। यह sort
या आम तौर पर strcoll()
आदेश के अनुरूप नहीं है ।
locale
आउटपुट क्या करता है? मैं इसे पुन: उत्पन्न नहीं कर सकता (touch foo; echo [A-Z]*
शाब्दिक पैटर्न को आउटपुट करता है, न कि "फू", अन्यथा खाली निर्देशिका में)।