सभी पाठों को अपरकेस से लोअरकेस और इसके विपरीत में बदलें?


17

मेरा सवाल यह है कि मैं अपरकेस से लेकर लोअरकेस और इसके विपरीत तक के सभी पाठ कैसे बदल सकता हूं? यानी सभी पत्रों के मामलों को बदलना। यह sedकिसी भी तरह एक प्रतिस्थापन के साथ किया जाना है ।


4
trसे अधिक उपयुक्त होगा sed
चेरोबा

जवाबों:


20

यहाँ एक सीधा तरीका है sed:

$ echo qWeRtY | sed -e 'y/abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ/ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/'
QwErTy

या GNU के साथ एक छोटा तरीका sed, किसी भी चरित्र के साथ काम करना जिसके लिए लोअरकेस <-> अपरकेस रूपांतरण आपके लोकेल में मौजूद है:

$ echo qWeRtY | sed -E 's/([[:lower:]])|([[:upper:]])/\U\1\L\2/g'
QwErTy

यदि आप किसी अन्य उपकरण का उपयोग कर सकते हैं, जैसे:

perl (ASCII पत्रों तक सीमित):

$ echo qWeRtY | perl -pe 'y/[a-z][A-Z]/[A-Z][a-z]/'
QwErTy

perl (आम तौर पर):

$ echo 'αΒγ' | perl -Mopen=locale -pe 's/(\p{Ll})|(\p{Lu})/uc($1).lc($2)/ge'
ΑβΓ

3
आपका दूसरा sedइनपुट में एक GNU और वैकल्पिक मामले को मानता है । sed -re 's/([[:lower:]]?)([[:upper:]]?)/\U\1\L\2/g'इसके बजाय (अभी भी जीएनयू विशिष्ट) का उपयोग करें । पहला केवल 26 ASCII लैटिन अक्षरों को परिवर्तित करता है, जबकि दूसरा आपके स्थानीय द्वारा पहचाने गए किसी भी अक्षर को परिवर्तित करता है। trएक केवल ASCII स्थानों में समझ में आता है। perlएक केवल ASCII लैटिन अक्षरों के लिए काम करता है।
स्टीफन चेज़लस

16

POSIXly, जो आपके sedद्वारा @cuonglm दिखाए जाने के रूप में लिप्यंतरित करने के लिए इच्छित अक्षरों का पूरा सेट प्रदान करने के अलावा नहीं किया जा सकता है ।

यह trहालांकि के साथ किया जा सकता है , और यही वह trहै जो (ट्रांसपेरेंट) है:

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

हालाँकि, लिनक्स पर, इसकी सीमाएँ हैं। trआमतौर पर लिनक्स आधारित प्रणालियों पर पाए जाने वाले 3 कार्यान्वयनों में से:

  • GNU के साथ tr, यह केवल सिंगल-बाइट कैरेक्टर सेट के लिए काम करता है। उदाहरण के लिए, Stéphane ChazelasUTF-8 स्थानों पर, sTéPHANE cHAZELASइसके बजाय देता है sTÉPHANE cHAZELAS। यह GNU की एक ज्ञात सीमा है tr
  • साथ trविरासत toolchest, वह काम नहीं करता से (आप प्राप्त stéphane chazelas)।
  • यह उस तरह का नहीं है जो बिजीबॉक्स trकरेगा।

FreeBSD पर जो हालांकि ठीक काम करता है। आप इसे प्रमाणित यूनिक्स प्रणालियों में भी ठीक काम करने की उम्मीद करेंगे।


bashखोल कि के लिए एक समर्पित ऑपरेटर है:

in=AbCdE
out=${in~~}

के साथ zsh -o extendedglob:

out=${in//(#b)(([[:lower:]])|([[:upper:]]))/${(U)match[2]}${(L)match[3]}}

तो डेस्कटॉप दुनिया में केवल OSX करता है? यह काम क्यों नहीं कर सकता? क्या यह सिर्फ अलग-अलग कार्यान्वयन है क्योंकि ऐसा लगता है कि उच्चारण चार्ट के निचले मामले संस्करण के बीच हेक्स मूल्य में एक निरंतर ऑफसेट है और यह अपरकेस काउंटरपार्ट है?

1
@ illumin world, निश्चित नहीं है कि आपका डेस्कटॉप दुनिया से क्या मतलब है । AFAICS, समस्या GNU के साथ है, अधिकांश यूनियनों में "डेस्कटॉप" हैं। ASCII और कुछ iso8859 चारसेट्स के अलावा, मुझे पता नहीं है कि आप हेक्स ऑफसेट चीज़ को सामान्य कर सकते हैं, और यह UTF-8 जैसे एनकोडिंग के साथ कोई मतलब नहीं होगा। उदाहरण के लिए UTF-8 में, अपरकेस (e2 b4 a0) (e1 83 80) है; दोनों i(69) और ı(सी 4 बी 1) है I(49) के रूप में अपरकेस (तुर्की स्थानों जहां को छोड़कर iहो जाता है İ)। जीएनयू के साथ काम नहीं करने का कारण यह trहै कि जीएनयू trबाइट्स के साथ काम करता है न कि पात्रों के साथ।
स्टीफन चेजलस

मैं मुख्य धारा का मतलब है, लेकिन यह वास्तव में इतना सिर ऊपर के लिए धन्यवाद मतलब नहीं है। मैंने बस फ्रांसीसी उच्चारण किए गए वर्ण (और वास्तव में सिर्फ "é") को देखा और बहुत ही सरल धारणाएं बनाईं, फिर से भूल गया कि यह बाइट्स के बारे में है। लेकिन वारिस एक? मैं फिर से उस जवाब को पढ़ने जाऊँगा!

1
@ इल्लुमिनो, हिरलूम के लिए, यह एक अलग मुद्दा है, ऐसा लगता है कि यह केवल एक घटना का समर्थन करता है [:lower:]या [:upper:](इसलिए पहले वाले को नजरअंदाज किया जाता है)। फ्रेंच में भी, œ -> Œहै c5 93 -> c5 92UTF-8 में और bd -> bciso8859-15 में।
स्टीफन चेजलस

2

यद्यपि इसमें वही सीमाएँ हैं जिनका उल्लेख trस्टीफन चेज़लस द्वारा प्रस्तुत समाधान के रूप में किया गया है , यह इसे करने का एक और तरीका है:

{   echo QWERTYqwerty | dd conv=lcase
    echo QWERTYqwerty | dd conv=ucase 
} 2>/dev/null

आउटपुट

qwertyqwerty
QWERTYQWERTY

मैं डंप stderrमें /dev/nullवहाँ क्योंकि ddयह भी पर अपने सभी आपरेशनों के आँकड़े उपलब्ध कराता है 2फ़ाइल वर्णनकर्ता। आप जो कर रहे हैं उसके आधार पर यह उपयोगी हो सकता है, लेकिन इस प्रदर्शन के लिए नहीं था। अन्य सभी सामान जो आप ddअभी भी लागू कर सकते हैं , उदाहरण के लिए:

echo QWERTYqwerty | dd bs=1 cbs=6 conv=unblock,ucase 2>/dev/null

उत्पादन:

QWERTY
QWERTY

यह मामले की अदला-बदली नहीं करता है (हालांकि में aBcपरिवर्तित नहीं है AbC)।
स्टीफन चेजलस

1
@ स्टीफनचेज़ेलैस - सच है, लेकिन जब तक मुझे गलत नहीं समझा गया, यह सवाल नहीं था, क्या यह था?
चाटुकार

2

यदि आपका मुख्य उद्देश्य किसी फ़ाइल को लोअरक्लास से अपरकेस में बदलना है, तो आप इसका उपयोग क्यों नहीं करते trऔर STDOUTअपनी फ़ाइल को परिवर्तित करने के लिए:

$cat FILENAME | tr a-z A-Z > FILENAME2

FILENAMEआपकी मूल फ़ाइल कहां है FILENAME2आपकी परिवर्तित आउटपुट फ़ाइल कहाँ है


यह उच्चारण किए गए वर्णों के साथ काम नहीं करता था, éउदाहरण के लिए (कम से कम मेरी फ़ाइल में)।
सिगुर

1

का उपयोग कर awk:

awk '{print tolower($0)}' file.txt | tee file.txt

तुम्हें यकीन है कि यह काम करने जा रहा है? >file.txtफ़ाइल को
रौंदकर

2
तब आपने स्पष्ट रूप से इसकी कोशिश नहीं की है।
स्टीफन चेज़लस

0

ruby उसके लिए एक स्ट्रिंग विधि है, जैसे कमांड लाइन से समान उपयोग perl

$ echo 'qWeRtY' | ruby -pe '$_.swapcase!'
QwErTy

रूबी-डॉक एनकोडिंग भी देखें

$ ruby -e 'puts Encoding.default_external'
UTF-8
$ echo 'αΒγ'  | ruby -pe '$_.swapcase!'
ΑβΓ

-1

साधारण बात को सरल रखो। अक्षरों का अनुवाद करने के लिए डिज़ाइन किया गया फ़िल्टर है tr

echo 1ude1UDE | tr [:upper:][:lower:] [:lower:][:upper:]

1
यह एक टूटा हुआ है (ग्लोबिंग ऑपरेटरों के आसपास गुम उद्धरणों के कारण) 2 साल पहले ही दिए गए उत्तर
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.