कैसे UTF-8 txt फ़ाइलों को bash में सभी अपरकेस में कनवर्ट करें?


10

मेरे पास कुछ UTF-8 .txt फाइलें हैं जिन्हें मैं सभी अपरकेस में परिवर्तित करना चाहूंगा। अगर यह सिर्फ ASCII होता, तो मैं उपयोग कर सकता था:

tr [:lower:] [:upper:]

लेकिन जब से मैं diacritics और सामान के साथ काम कर रहा हूँ, यह काम नहीं करता है। मुझे लगता है कि अगर मैं उपयुक्त लोकेल सेट करूं तो यह काम कर सकता है, लेकिन मुझे इस स्क्रिप्ट के पोर्टेबल होने की आवश्यकता है।

जवाबों:


14

के सभी:

tr '[:lower:]' '[:upper:]'

(उद्धरण मत भूलना, अन्यथा कि नहीं होगा काम वहाँ एक फ़ाइल कहा जाता है कि अगर :, l... या rमौजूदा निर्देशिका में) या:

awk '{print toupper($0)}'

या:

dd conv=ucase

वर्तमान स्थान में परिभाषित नियमों के अनुसार अक्षरों को अपरकेस में बदलने के लिए है। हालांकि, यहां तक ​​कि जहां यूटीएफ -8 का उपयोग चरित्र सेट के रूप में करते हैं और निचले हिस्से से अपरकेस में रूपांतरण को स्पष्ट रूप से परिभाषित करते हैं, कम से कम GNU dd, GNU trऔर उदाहरण के लिए mawk( awkUbuntu पर डिफ़ॉल्ट ) उनका पालन नहीं करते हैं। इसके अलावा, वहाँ कोई है मानक के अलावा अन्य स्थानों निर्दिष्ट करने के लिए जिस तरह से Cया POSIX, इसलिए यदि आप portably वर्तमान स्थान की परवाह किए बिना अपरकेस में UTF-8 फ़ाइलें कनवर्ट करना चाहते हैं, तो आप मानक toolchest साथ भाग्य से बाहर रहे हैं।

पोर्टेबिलिटी के लिए, आपका सबसे अच्छा दांव पर्ल हो सकता है:

$ echo lľsšcčtťzž | PERLIO=:utf8 perl -pe '$_=uc'
LĽSŠCČTŤZŽ

अब, आपको सावधान रहने की जरूरत है कि हर कोई इस बात पर सहमत नहीं है कि एक विशिष्ट चरित्र का अपरकेस संस्करण क्या है।

उदाहरण के लिए, तुर्की स्थानों में, अपरकेस iनहीं है I, लेकिन İ( <U0130>)। यहाँ trGNU tr के बजाय हीलूम टूलकिट के साथ :

$ echo ií | LC_ALL=C.UTF-8 tr '[:lower:]' '[:upper:]'
IÍ
$ echo ií | LC_ALL=tr_TR.UTF-8 tr '[:lower:]' '[:upper:]'
İÍ

मेरे सिस्टम पर, perlऊपरी-ऊपरी रूपांतरण को परिभाषित किया गया है /usr/share/perl/5.14/unicore/To/Upper.pl, और मुझे लगता है कि यह उदाहरण के लिए, लोकेल toupper()में GNU libc से कुछ वर्णों पर अलग-अलग व्यवहार करता है C.UTF8, perlअधिक सटीक होने के कारण। उदाहरण के लिए, perlसही ढंग से ɀ से GN में कनवर्ट करता है , GNU libc (2.17) नहीं।


इसके मूल्य के लिए, मैं चेक अक्षरों के साथ काम कर रहा हूं (और आपके द्वारा उपयोग किया गया उदाहरण वास्तव में स्लोवाक है), जहां सभी अपरकेस अक्षरों को स्पष्ट रूप से परिभाषित किया गया है, लेकिन लोकेल सेट संभवतः सी होगा और चेक नहीं होगा ताकि यह एक समस्या हो। इस टूलकिन में पहले से ही पर्ल का उपयोग किया गया है, इसलिए दूसरा उपयोग जोड़ना बहुत बुरा नहीं हो सकता है। विस्तृत विवरण के लिए धन्यवाद, btw!
VPeric

3

मुझे लगता है कि आप इसे awkऔर इसके toupperकार्य के साथ कर सकते हैं ।

उदाहरण के लिए

GNU के साथ काम नहीं करता है tr:

$ echo lľsšcčtťzž | tr '[:lower:]' '[:upper:]'
LľSšCčTťZž

GNU के साथ काम करता है awk:

$ echo lľsšcčtťzž | awk '{ print toupper($0) }'
LĽSŠCČTŤZŽ

@StephaneChazelas - धन्यवाद मैंने असफल उदाहरण को बदल दिया।
स्लम

यह वर्तमान लोकल और पर trया awkकार्यान्वयन पर निर्भर करता है । उदाहरण के लिए, trUTF8 लोकेल में, वर्तमान लोकेल के अनुसार, GNU trनहीं करता है , तो सबसे सही ढंग से चरित्र को परिवर्तित करेगा । mawkऐसा नहीं करता।
स्टीफन चेजलस

1
दरअसल, FreeBSD (9.1) पर, यह दूसरा तरीका है। यह साथ काम करता है tr, लेकिन साथ नहींawk
स्टीफन चेज़लस

@ स्टेफेनचैजेलस - मैं 8--zel के संस्करण पर पारंगत नहीं हूं। किसी ने सिर्फ अपमानित किया, आश्चर्य क्यों?
स्लम

2

यह OS X के साथ काम करता है trलेकिन GNU के साथ नहीं tr:

tr '[:lower:]' '[:upper:]'

इस के साथ काम करता gawkहै, लेकिन साथ नहीं mawkया nawk(जो /usr/bin/awkओएस एक्स में):

awk '{print toupper($0)}'

एक अन्य विकल्प GNU का उपयोग करना है sed:

sed 's/./\u&/g'

बाश 4.0 में और बाद में आप ^^पैरामीटर विस्तार का भी उपयोग कर सकते हैं :

while IFS= read -r l;do printf %s\\n "${l^^}";done
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.