इसे सरल रखते हुए - पूंछ
हमें वर्णों को गिनने के लिए एक नियमित अभिव्यक्ति, या एक से अधिक प्रक्रियाओं की आवश्यकता नहीं होनी चाहिए।
कमांड tail
, जिसे अक्सर किसी फ़ाइल की अंतिम पंक्तियों को दिखाने के लिए उपयोग किया जाता है , में एक विकल्प -c
( --bytes
) होता है, जो इसके लिए सही उपकरण लगता है:
$ printf 123456789 | tail -c 3
789
(जब आप एक शेल में होते हैं, तो यह एक विधि का उपयोग करने के लिए समझ में आता है जैसे कि माइकसर्व के उत्तर में, क्योंकि यह प्रक्रिया शुरू करने से बचाता है tail
।)
असली यूनिकोड वर्ण?
अब, आप पिछले तीन पात्रों के लिए पूछते हैं ; यही कारण है कि यह जवाब आपको नहीं देता है: यह अंतिम तीन बाइट्स का उत्पादन करता है !
जब तक प्रत्येक चरित्र एक बाइट है, तब तक tail -c
काम करता है। तो इसका उपयोग चरित्र सेट ASCII
, ISO 8859-1
या एक संस्करण है , तो इसका इस्तेमाल किया जा सकता है ।
यदि आपके पास यूनिकोड इनपुट है, जैसे सामान्य UTF-8
प्रारूप में, तो परिणाम गलत है:
$ printf 123αβγ | tail -c 3
�γ
इस उदाहरण में, UTF-8
ग्रीक वर्ण अल्फा, बीटा और गामा का उपयोग करते हुए दो बाइट्स लंबे होते हैं:
$ printf 123αβγ | wc -c
9
विकल्प -m
कम से कम वास्तविक यूनिकोड वर्णों की गणना कर सकता है:
printf 123αβγ | wc -m
6
ठीक है, इसलिए पिछले 6 बाइट्स हमें आखिरी 3 अक्षर देंगे:
$ printf 123αβγ | tail -c 6
αβγ
तो, tail
सामान्य पात्रों को संभालने का समर्थन नहीं करता है, और यह भी प्रयास नहीं करता है (नीचे देखें): यह चर आकार लाइनों को संभालता है, लेकिन कोई चर आकार वर्ण नहीं।
आइए इसे इस तरह से रखें: tail
समस्या की संरचना को हल करने के लिए सिर्फ सही है, लेकिन डेटा के प्रकार के लिए गलत है।
GNU कोरुटिल्स
आगे देख रहे हैं, यह पता चला है कि तुमको GNU coreutils, बुनियादी उपकरण के संग्रह की तरह sed
, ls
, tail
और cut
, अभी तक पूरी तरह अंतरराष्ट्रीयकरण नहीं है। जो मुख्य रूप से यूनिकोड का समर्थन करने के बारे में है।
उदाहरण के लिए, cut
चरित्र समर्थन के लिए पूंछ के बजाय उपयोग करने के लिए एक अच्छा उम्मीदवार होगा; इसमें बाइट्स या चार्ट पर काम करने के विकल्प हैं, -c
( --bytes
) और -m
( --chars
);
केवल वह -m
/ --chars
है, संस्करण के रूप में
cut (GNU coreutils) 8.21
, 2013,
कार्यान्वित नहीं किया गया!
से info cut
:
`-c CHARACTER-LIST'
`--characters=CHARACTER-LIST'
Select for printing only the characters in positions listed in CHARACTER-LIST.
The same as `-b' for now, but internationalization will change that.
UTF-8 के साथ `cut -c` (` --characters`) का उपयोग नहीं करने के लिए
यह उत्तर भी देखें ।
grep -o '.\{3\}$'