अपर-केस स्ट्रिंग को लोअर-केस में बदलने की कमांड?


47

बैश कमांड क्या है जिसे मैं अपर-केस स्ट्रिंग को लोअर-केस में बदलने के लिए उपयोग कर सकता हूं और इसके विपरीत?

धन्यवाद।


2
संभव के रूप में ही: unix.stackexchange.com/questions/51983/…
Ciro Santilli 中心 un un un

2
पर समाधान के बहुत सारे stackoverflow.com/questions/2264428/... भी। सरसरी निगाह से सबसे ज्यादा यहां भी कवर किया गया लगता है।
pbhj

जवाबों:


59

यदि स्ट्रिंग पहले से ही एक चर में संग्रहीत है, तो आप विशिष्ट रूप से bashपैरामीटर विस्तार का उपयोग कर सकते हैं , ${parameter,,pattern}(bash 4.0 के बाद से उपलब्ध), जहां parameterआपके चर का नाम है और patternommitted है:

$ string="Hello, World!"
$ echo $string
Hello, World!
$ echo ${string,,}
hello, world!

ध्यान दें कि यह चर का मान नहीं बदलता है, केवल आउटपुट। चर को बदलने के लिए आपको नया मान असाइन करना होगा:

$ echo $string
Hello, World!
$ string=${string,,}
$ echo $string
hello, world!

ऊपरी-मामला रूपांतरण इसके साथ काम करता है ${parameter^^pattern}:

$ echo ${string^^}
HELLO, WORLD!

यह यूनिकोड स्ट्रिंग्स के साथ भी काम करता है (कम से कम वर्तमान बैश संस्करणों के साथ, शायद कम से कम बैश 4.3 की आवश्यकता है)

$ string='ἈΛΦΆβητος'
$ echo ${string,,}
ἀλφάβητος
$ echo ${string^^}
ἈΛΦΆΒΗΤΟΣ

यदि आप उपयोग कर रहे हैं zsh, तो समान परिणाम प्राप्त करने के लिए आप Parameter Expansion Flags ( ${(FLAGS)NAME}, zsh 2.5 के बाद से उपलब्ध) का उपयोग कर सकते हैं । bashवाक्य रचना में काम नहीं करता है zsh 1) । निचले मामले के लिए झंडा है L; ऊपरी मामले के लिए यह है U:

$ string="Hello, World!"
$ echo ${(L)string}
hello, world!
$ echo ${(U)string}
HELLO, WORLD!
$ echo $string
Hello, World!"

यह भी यूनिकोड स्ट्रिंग्स (कम से कम zsh 5.0 के साथ काम करता है; मैंने पहले संस्करणों के साथ प्रयास नहीं किया)

$ string='ἈΛΦΆβητος'
$ echo ${(L)string} 
ἀλφάβητος
$ echo ${(U)string}  
ἈΛΦΆΒΗΤΟΣ



1) हालाँकि, यह देखते हुए कि zsh के पास यह लंबे समय तक था, यह शायद होना चाहिए: " zshवाक्यविन्यास काम नहीं करता हैbash


3
${string,,}अंकन केवल बैश संस्करण के लिए मौजूद है 4। अन्यथा अन्य समाधानों में से एक की आवश्यकता होती है, जैसे कि $(echo $string | tr '[:upper:]' '[:lower:]')
क्विन कॉमेंडेंट

40

बहुत कम विधियाँ हैं जो यूनिकोड के साथ सही तरीके से काम करती हैं:

GNU sed 4.2.2 कार्य :

$ echo "Idą gęsi łąką" | sed 's/.*/\U&/'
IDĄ GĘSI ŁĄKĄ

बैश 4.2.45 घोषित नहीं करता है:

$ typeset -u ucase; ucase="Idą gęsi łąką"; echo $ucase
IDą GęSI łąKą

बैश 4.2.45 पैरामीटर विस्तार काम नहीं करता है:

$ str="Idą gęsi łąką"; echo ${str^^}
IDą GęSI łąKą

बैश 4.3.42 declareऔर पैरामीटर विस्तार कार्य :

$ declare -u ucase
$ ucase="Idą gęsi łąką"
$ echo $ucase
IDĄ GĘSI ŁĄKĄ
$ echo ${ucase,,}
idą gęsi łąką

GNU tr 8.20 काम नहीं करता है:

$ echo "Idą gęsi łąką" | tr '[:lower:]' '[:upper:]'
IDą GęSI łąKą

mawk (Ubuntu 13.10 में डिफ़ॉल्ट awk) काम नहीं करता है:

$ echo "Idą gęsi łąką" | mawk '{print toupper($0)}'
IDą GęSI łąKą

पंजा काम करता है :

$ echo "Idą gęsi łąką" | gawk '{print toupper($0)}'
IDĄ GĘSI ŁĄKĄ

पर्ल शुद्ध uc () काम नहीं करता है:

$ echo "Idą gęsi łąką" | perl -ne 'print uc($_);'
IDą GęSI łąKą

अजगर 2 बिना किसी यूनिकोड संकेत के काम नहीं करता है:

$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().upper(),'
IDą GęSI łąKą

अजगर 2 जब यूनिकोड कार्यों से निपटने का निर्देश दिया गया :

$ echo "Idą gęsi łąką" | python -c 'import sys; print sys.stdin.read().decode("utf-8").upper(),'
IDĄ GĘSI ŁĄKĄ

अजगर 3 काम करता है :

$ echo "Idą gęsi łąką" | python3 -c 'import sys; print(sys.stdin.read().upper(), end="")'
IDĄ GĘSI ŁĄKĄ

1
उबंटू 13.04 पर, मेरे पास gawkडिफ़ॉल्ट awk (जैसा कि दिखाया गया है update-alternatives --display awk) है। क्या आप वाकई mawk13.10 में डिफ़ॉल्ट हैं?
kiri

sed1990 के बाद से \Uविकल्प का समर्थन किया ;-)। ग्नू-सेड विशिष्ट विशेषता नहीं। अन्यथा, महान जवाब, इतने सारे विकल्प, इतना कम समय; ;-) सभी को शुभकामनाएँ!
शेल्टर

इसके अलावा तुर्की के साथ कुछ मुद्दे होंगे (बिंदीदार और बिंदु रहित i), निम्नलिखित लिंक पर अधिक जानकारी के लिए: - unicode.org/Public/UNIDATA/SpecialCasing.txt - stackoverflow.com/questions/235423231/… - en.wikipedia org / wiki / Dotted_and_dotless_I
azat

आपके उदाहरण में, पर्स ucपर्ल में काम नहीं करता है क्योंकि आपको करना है use Encodeया करना है use utf8। अपने उदाहरण को फिर से लिखें echo "Idą gęsi łąką" | perl -ne 'use Encode;print encode("utf-8",uc(decode("utf-8",$_)))'और यह काम करेगा। इसके अलावा देखें stackoverflow.com/a/13261662/3701431
सर्गी कोलोडियाज़नी

20

मैं एक निचले चर को परिभाषित करने के लिए बैश आंतरिक टाइपसेट या डिक्लेयर कमांड का उपयोग करूंगा ।

$ typeset -l lcase
$ lcase="LoWeR cAsE"
$ echo $lcase
lower case

जब मूल्य को सेट किया जाता है, तब चर को कम नहीं किया जाता है, जब आप चर को टाइप करते हैं। इसलिए स्क्रिप्ट की शुरुआत में टाइप करना बेहतर है। अपरकेस के लिए आप टाइप -यू कर सकते हैं ।

$ typeset -u ucase
$ ucase="Upper cAsE"
$ echo $ucase
UPPER CASE

यह शेल को काटने के लिए विशिष्ट नहीं है, जो कि ksh पर भी काम करता है, शायद POSIX शेल परिभाषा में।

संपादित करें: बहुत से लोगों ने धीरे से मुझे इस तथ्य की ओर इशारा किया कि टाइपसेट अब बैश पर अप्रचलित माना जाता है और घोषणा द्वारा प्रतिस्थापित किया जाता है । दोनों आज्ञाएँ बराबर हैं।

$ help typeset
typeset: typeset [-aAfFgilrtux] [-p] name[=value] ...
    Set variable values and attributes.

    Obsolete.  See `help declare'.


$ help declare
declare: declare [-aAfFgilrtux] [-p] [name[=value] ...]
    Set variable values and attributes.

मैं स्वयं अभी भी टाइपसेट सिंटैक्स का उपयोग करता हूं क्योंकि मैं विषम वातावरण पर काम करता हूं, इसलिए मुझे अपनी स्क्रिप्ट को फिर से लिखना नहीं पड़ता है।


2
+1 अतुल्य, मुझे कभी नहीं पता था कि एक! btw कुछ अतिरिक्त जानकारी: मैंने इसे मैनुअल में देखा और ऐसा लगता है कि इसे typesetdeclare
विकृत

1
@ थैंक यू, ऐसा लगता है कि बैश ने अपनी "बॉर्न शेल जड़ों" से दूर एक जीवन शुरू किया :) :)
इमैनुएल

17

आप इसे trकमांड से कर सकते हैं ।

टर्मिनल में ( Ctrl+ Alt+ T)

यह आदेश:

echo 'String here' | tr "[:lower:]" "[:upper:]"

अपरकेस को अपरकेस में कनवर्ट करेगा।

echo 'STRING HERE' | tr "[:upper:]" "[:lower:]"

अपरकेस को लोअरकेस में बदल देगा।

उदाहरण:

यहाँ छवि विवरण दर्ज करें

क्रेडिट साइबरिटी को जाता है


2
यदि आप स्थानों की परवाह नहीं करते हैं, तो tr A-Z a-zभी काम करेगा।
निक मैटेओ

9

आप चीजों को sedभी पाइप कर सकते हैं:

$ echo lowercase | sed 's/.*/\U&/'
LOWERCASE

और \Lविपरीत प्रभाव पड़ेगा:

$ echo UPPERCASE | sed 's/.*/\L&/'
uppercase

1

यह एक शुद्ध बैश समाधान नहीं है, लेकिन आप अपने तारों को पाइप कर सकते हैं perl(जैसा कि ओली ने किया था sed):

$ echo lowercase | perl -ne 'print "\U$_"'
LOWERCASE

और \Lविपरीत प्रभाव पड़ेगा:

$ echo UPPERCASE | perl -ne 'print "\L$_"'
uppercase

-1

इस सरल आदेश का उपयोग करें ऊपरी से निचले मामले के लिए जहाँ 'f' फ़ाइल नाम है जहाँ आप रूपांतरण करना चाहते हैं।

tr "A-Z" "a-z" < f

निचले से ऊपरी मामले के लिए

tr "a-z" "A-Z" < f

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