आदेश cut
में विकल्प -c
के साथ बाइट्स के बजाय, वर्णों पर काम करने का विकल्प होता है -b
। लेकिन यह en_US.UTF-8
स्थानीय में काम करने के लिए नहीं लगता है :
दूसरा बाइट दूसरा ASCII वर्ण देता है (जो UTF-8 में केवल एक ही एन्कोड किया गया है):
$ printf 'ABC' | cut -b 2
B
लेकिन UTF-8 लोकेल में तीन ग्रीक गैर-एएससीआईआई पात्रों में से दूसरा नहीं देता है:
$ printf 'αβγ' | cut -b 2
�
यह ठीक है - यह दूसरी बाइट है ।
इसलिए हम इसके बजाय दूसरे चरित्र को देखते हैं:
$ printf 'αβγ' | cut -c 2
�
जो टूटा हुआ दिखता है।
कुछ प्रयोगों के साथ, यह पता 3-4
चलता है कि सीमा दूसरा वर्ण दिखाती है:
$ printf 'αβγ' | cut -c 3-4
β
लेकिन यह बाइट्स 3 से 4 के समान ही है:
$ printf 'αβγ' | cut -b 3-4
β
तो UTF-8 -c
के -b
लिए इससे अधिक नहीं है ।
मुझे उम्मीद है कि UTF-8 के लिए लोकल सेटअप सही नहीं है, लेकिन तुलना में, उम्मीद के मुताबिक wc
काम करता है;
इसका उपयोग अक्सर बाइट्स को गिनने के लिए किया जाता है, विकल्प -c
( --bytes
) के साथ।
(भ्रमित करने वाले विकल्प नामों पर ध्यान दें।)
$ printf 'αβγ' | wc -c
6
लेकिन यह विकल्प के साथ वर्ण भी गिन सकता है -m
( --chars
), जो सिर्फ काम करता है:
$ printf 'αβγ' | wc -m
3
तो मेरा विन्यास ठीक लगता है - लेकिन कुछ खास है cut
।
शायद यह UTF-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
वास्तव में किसके लिए है।