কমান্ডটিতে cut
বিকল্পগুলির -c
সাথে বাইটের পরিবর্তে অক্ষরগুলিতে কাজ করার বিকল্প রয়েছে -b
। তবে en_US.UTF-8
স্থানীয়ভাবে এটি কার্যকর বলে মনে হচ্ছে না :
দ্বিতীয় বাইট দ্বিতীয় ASCII অক্ষর দেয় (যা ইউটিএফ -8 এ ঠিক একইভাবে এনকোড করা হয়েছে):
$ printf 'ABC' | cut -b 2
B
তবে ইউটিএফ -8 লোকালে তিনটি গ্রীক নন-এএসসিআইআই অক্ষরের দ্বিতীয়টি দেয় না:
$ printf 'αβγ' | cut -b 2
�
ঠিক আছে - এটি দ্বিতীয় বাইট ।
সুতরাং আমরা পরিবর্তে দ্বিতীয় চরিত্র তাকান :
$ printf 'αβγ' | cut -c 2
�
দেখতে দেখতে ভাঙা লাগছে।
কিছু পরীক্ষা-নিরীক্ষার সাহায্যে দেখা যাচ্ছে যে পরিসীমাটি 3-4
দ্বিতীয় চরিত্রটি দেখায়:
$ printf 'αβγ' | cut -c 3-4
β
তবে এটি 3 থেকে 4 এর বাইটের সমান:
$ printf 'αβγ' | cut -b 3-4
β
সুতরাং ইউটিএফ -8 এর -c
চেয়ে বেশি নয় -b
।
আমি প্রত্যাশা করব লোকাল সেটআপটি ইউটিএফ -8 এর জন্য সঠিক নয়, তবে তুলনায়, wc
প্রত্যাশার মতো কাজ করে;
এটি প্রায়শই অপশন -c
( --bytes
) সহ বাইট গণনা করতে ব্যবহৃত হয় ।
(বিভ্রান্তিকর বিকল্পের নামগুলি নোট করুন))
$ printf 'αβγ' | wc -c
6
তবে এটি বিকল্প -m
( --chars
) সহ অক্ষরগুলিও গণনা করতে পারে , যা কেবল কাজ করে:
$ printf 'αβγ' | wc -m
3
সুতরাং আমার কনফিগারেশনটি ঠিক আছে বলে মনে হচ্ছে - তবে এটির জন্য বিশেষ cut
।
সম্ভবত এটি ইউটিএফ -8 সমর্থন করে না? তবে এটি বহু-বাইট অক্ষরকে সমর্থন করে বলে মনে হচ্ছে, অন্যথায় এটি সমর্থন করার প্রয়োজন হবে না -b
এবং -c
।
তো, ভুল কি? এবং কেন?
লোকাল সেটআপটি utf8-র জন্য সঠিক দেখাচ্ছে, যতদূর আমি বলতে পারি:
$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US
LC_CTYPE=en_US.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
ইনপুট, বাইট দ্বারা বাইট:
$ printf 'αβγ' | hd
00000000 ce b1 ce b2 ce b3 |......|
00000006
-c
হচ্ছে এটি একই কোডটি ব্যবহার করছে-b
। আপনি কি সোর্স কোডটি একবার দেখেছেন? সম্ভবত আপনি একটি ইঙ্গিতটি খুঁজে পেতে পারেন-c
যা আসলে বোঝানো হয়েছে।