यह एक ज्ञात ( 1 , 2 , 3 , 4 , 5 , 6 ) GNU कार्यान्वयन की सीमा है tr
।
यह उतना नहीं है कि यह विदेशी , गैर-अंग्रेजी या गैर-एएससीआईआई वर्णों का समर्थन नहीं करता है, लेकिन यह मल्टी-बाइट वर्णों का समर्थन नहीं करता है।
उन सिरिलिक वर्णों को ठीक माना जाएगा, यदि iso8859-5 (एकल-बाइट प्रति वर्ण) वर्ण सेट में लिखा गया हो (और आपका स्थान उस वर्ण का उपयोग कर रहा था), लेकिन आपकी समस्या यह है कि आप UTF-8 का उपयोग कर रहे हैं जहाँ गैर- ASCII वर्ण 2 या अधिक बाइट्स में एन्कोड किए गए हैं।
जीएनयू को एक योजना मिली (यह भी देखें ) कि इसे ठीक करने के लिए काम चल रहा है लेकिन अभी तक नहीं हुआ है।
FreeBSD या Solaris tr
में समस्या नहीं है।
इस समय के अधिकांश मामलों के लिए tr
, आप GNU sed या GNU awk का उपयोग कर सकते हैं जो बहु-बाइट वर्णों का समर्थन करते हैं।
उदाहरण के लिए, आपका:
tr -cs '[[:alpha:][:space:]]' ' '
लिखा जा सकता है:
gsed -E 's/( |[^[:space:][:alpha:]])+/ /'
या:
gawk -v RS='( |[^[:space:][:alpha:]])+' '{printf "%s", sep $0; sep=" "}'
निचले और ऊपरी मामले में परिवर्तित करने के लिए ( tr '[:upper:]' '[:lower:]'
):
gsed 's/[[:upper:]]/\l&/g'
( l
यह एक लोअरकेस है L
, 1
अंक नहीं )।
या:
gawk '{print tolower($0)}'
पोर्टेबिलिटी के लिए, perl
एक और विकल्प है:
perl -Mopen=locale -pe 's/([^[:space:][:alpha:]]| )+/ /g'
perl -Mopen=locale -pe '$_=lc$_'
यदि आप जानते हैं कि डेटा को एक एकल-बाइट वर्ण सेट में दर्शाया जा सकता है, तो आप इसे चारसेट में संसाधित कर सकते हैं:
(export LC_ALL=ru_RU.iso88595
iconv -f utf-8 |
tr -cs '[:alpha:][:space:]' ' ' |
iconv -t utf-8) < Russian-file.utf8