[A-Z]
মধ্যে bash
ম্যাচ সব উপাদান ক্রমানুসারে সাজানো (অক্ষর কিন্তু কল হতে মত অক্ষরের ক্রম Dsz
হাঙ্গেরীয় লোকেলে) যে সাজানোর পর A
এবং সাজানোর আগে Z
। আপনার লোকালে c
সম্ভবত বি এবং সি এর মধ্যে বাছাই করা থাকে probably
$ 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
লোকেল (ডেটা অভিমানী BIG5 বা GB18030 যা কয়েক অক্ষর যার এনকোডিং রয়েছে মত চরিত্র সেটে এনকোড করা হয় না ধারণ করে অথবা তালিকার সেই চিঠির এনকোডিং) তাদের পৃথকভাবে ( [ABCDEFGHIJKLMNOPQRSTUVWXYZ]
)।
খেয়াল করুন যে শাঁসের মধ্যে কিছু পার্থক্য রয়েছে।
এর জন্য zsh
, bash -O globasciiranges
(বাশ -৩.৩ এ আশ্চর্যজনকভাবে নামযুক্ত বিকল্পটি চালু করা হয়েছে), schily-sh
এবং yash
, [A-Z]
এমন অক্ষরের সাথে মেলে যাঁর কোড পয়েন্টটি এর A
এবং এর মধ্যকার হয় Z
, তাই bash
সি লোকেলের আচরণের সমতুল্য হবে ।
ছাই, মাক্স এবং প্রাচীন শাঁসের জন্য zsh
উপরের মতো তবে একক বাইট অক্ষরেখার মধ্যে সীমাবদ্ধ। উদাহরণস্বরূপ, কোনও ইউটিএফ -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]'
), এটা সিস্টেম এবং লোকেল উপর নির্ভর করে। উদাহরণস্বরূপ, একজন গনুহ সিস্টেম এখানে উপর, [A-Z]
উপর মিলছে না x
এ en_GB.UTF-8
লোকেল, কিন্তু এটা মধ্যে আছে th_TH.UTF-8
এক। এটি নির্ধারণ করতে এটি কোন তথ্য ব্যবহার করে তা আমার কাছে অস্পষ্ট, তবে এটি দৃশ্যত LC_COLLATE লোকাল ডেটা থেকে প্রাপ্ত লুকিং টেবিলের উপর ভিত্তি করে )।
পসিক্সের দ্বারা সমস্ত আচরণের অনুমতি দেওয়া হয়েছে কারণ পসিক্স সি লোকেল ব্যতীত অন্য লোকেলগুলিতে নির্ধারিত রেঞ্জের আচরণ ছেড়ে দেয়। এখন আমরা প্রতিটি পদ্ধতির সুবিধা নিয়ে তর্ক করতে পারি।
bash
এর পদ্ধতির সাথে অনেকটা ধারণা তৈরি হয় [C-G]
, আমরা এর মধ্যে C
এবং অক্ষরগুলি চাই G
। এবং এর মধ্যে যা আছে তা নির্ধারণ করে এর জন্য ব্যবহারকারীর সাজানোর ক্রমটি ব্যবহার করা সর্বাধিক যৌক্তিক পদ্ধতি।
এখন, সমস্যাটি হ'ল এটি প্রচুর মানুষের প্রত্যাশা ভঙ্গ করে, বিশেষত people লোকেরা প্রাক-ইউনিকোড এমনকি প্রাক-আন্তর্জাতিকীকরণের দিনগুলির প্রচলিত আচরণে অভ্যস্ত ছিল। যদিও একজন সাধারণ ব্যবহারকারী থেকে মে এই অর্থে যে তোলে [C-I]
অন্তর্ভুক্ত h
হিসাবে h
চিঠি মধ্যে C
এবং I
এবং যে [A-g]
অন্তর্ভুক্ত নয় Z
, লোকেরা শুধু কয়েক দশক ধরে হওয়া ASCII মোকাবেলা থাকার জন্য একটি ভিন্ন ব্যাপার।
যে bash
আচরণ থেকে এছাড়াও ভিন্ন [A-Z]
(হিসাবে গনুহ রেগুলার এক্সপ্রেশনের মধ্যে মত অন্যান্য গনুহ সরঞ্জাম পরিসীমা ম্যাচিং grep
/ sed
...) অথবা fnmatch()
হিসাবে find -name
।
এর অর্থ হ'ল কী [A-Z]
মেলে তা পরিবেশের সাথে ওএস এবং ওএসের সংস্করণের সাথে পরিবর্তিত হয়। সত্য যে [A-Z]
একটি ম্যাচ কিন্তু Z এছাড়াও দরুণ পর্যাপ্ত নয়।
জন্য zsh
/ yash
, আমরা একটি ভিন্ন সাজানোর ক্রম ব্যবহার করুন। চরিত্র ক্রমের ব্যবহারকারীর ধারণার উপর নির্ভর করার পরিবর্তে আমরা অক্ষর বিন্যাস কোড মানগুলি ব্যবহার করি। এটি সহজেই বোঝার সুবিধা রয়েছে তবে এএসসিআইআই এর বাইরে কয়েকজনের ব্যবহারিক দিক থেকে এটি খুব বেশি কার্যকর নয়। [A-Z]
26 ইউএস-ইংলিশ উচ্চ-অক্ষরের অক্ষরের সাথে [0-9]
মেলে, দশমিক অঙ্কের সাথে মেলে। ইউনিকোডে কোড পয়েন্ট রয়েছে যা কিছু বর্ণমালার ক্রম অনুসরণ করে তবে এটি সাধারণীকরণ হয় না এবং সাধারণকরণ করা যায় না কারণ যেভাবে একই স্ক্রিপ্ট ব্যবহার করা বিভিন্ন ব্যক্তি অবশ্যই অক্ষরের ক্রমের সাথে একমত হন না।
Traditionalতিহ্যবাহী শাঁস এবং ম্যাক্স, ড্যাশগুলির জন্য, এটি ভেঙে গেছে (এখন বেশিরভাগ লোকেরা মাল্টি-বাইট অক্ষর ব্যবহার করে) তবে মূলত কারণ তাদের এখনও মাল্টি-বাইট সমর্থন নেই। শেলগুলিতে মাল্টি-বাইট সমর্থন যুক্ত করা bash
এবং zsh
এটি একটি বিশাল প্রচেষ্টা এবং এখনও অব্যাহত রয়েছে। yash
(একটি জাপানিজ শেল) প্রথম থেকেই বহু-বাইট সমর্থন দিয়ে ডিজাইন করা হয়েছিল।
সিস্টেমের নিয়মিত এক্সপ্রেশন বা fnmatch () (বা কমপক্ষে GNU সিস্টেমে কমপক্ষে প্রদর্শিত হবে) এর সাথে সামঞ্জস্য হওয়ার জন্য ksh93 এর পদ্ধতির সুবিধা রয়েছে। সেখানে, এটি কিছু লোকের প্রত্যাশা ভঙ্গ [A-Z]
করে না কারণ এর মধ্যে ছোট ছোট অক্ষর [A-Z]
অন্তর্ভুক্ত নেই É
(এবং Á, তবে not নয়)। এটি সামঞ্জস্যপূর্ণ নয় sort
বা সাধারণত strcoll()
অর্ডার করে।
locale
আউটপুট কি করে ? আমি এটি পুনরুত্পাদন করতে পারি না (touch foo; echo [A-Z]*
অন্যথায় ফাঁকা ডিরেক্টরিতে "foo" নয়, আক্ষরিক প্যাটার্নটি আউটপুট করে)।