बैश कमांड क्या है जिसे मैं अपर-केस स्ट्रिंग को लोअर-केस में बदलने के लिए उपयोग कर सकता हूं और इसके विपरीत?
धन्यवाद।
बैश कमांड क्या है जिसे मैं अपर-केस स्ट्रिंग को लोअर-केस में बदलने के लिए उपयोग कर सकता हूं और इसके विपरीत?
धन्यवाद।
जवाबों:
यदि स्ट्रिंग पहले से ही एक चर में संग्रहीत है, तो आप विशिष्ट रूप से bash
पैरामीटर विस्तार का उपयोग कर सकते हैं , ${parameter,,pattern}
(bash 4.0 के बाद से उपलब्ध), जहां parameter
आपके चर का नाम है और pattern
ommitted है:
$ 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
।
${string,,}
अंकन केवल बैश संस्करण के लिए मौजूद है 4। अन्यथा अन्य समाधानों में से एक की आवश्यकता होती है, जैसे कि $(echo $string | tr '[:upper:]' '[:lower:]')
।
बहुत कम विधियाँ हैं जो यूनिकोड के साथ सही तरीके से काम करती हैं:
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Ą
gawk
डिफ़ॉल्ट awk (जैसा कि दिखाया गया है update-alternatives --display awk
) है। क्या आप वाकई mawk
13.10 में डिफ़ॉल्ट हैं?
sed
1990 के बाद से \U
विकल्प का समर्थन किया ;-)। ग्नू-सेड विशिष्ट विशेषता नहीं। अन्यथा, महान जवाब, इतने सारे विकल्प, इतना कम समय; ;-) सभी को शुभकामनाएँ!
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
मैं एक निचले चर को परिभाषित करने के लिए बैश आंतरिक टाइपसेट या डिक्लेयर कमांड का उपयोग करूंगा ।
$ 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.
मैं स्वयं अभी भी टाइपसेट सिंटैक्स का उपयोग करता हूं क्योंकि मैं विषम वातावरण पर काम करता हूं, इसलिए मुझे अपनी स्क्रिप्ट को फिर से लिखना नहीं पड़ता है।
typeset
declare
आप इसे tr
कमांड से कर सकते हैं ।
टर्मिनल में ( Ctrl+ Alt+ T)
यह आदेश:
echo 'String here' | tr "[:lower:]" "[:upper:]"
अपरकेस को अपरकेस में कनवर्ट करेगा।
echo 'STRING HERE' | tr "[:upper:]" "[:lower:]"
अपरकेस को लोअरकेस में बदल देगा।
उदाहरण:
क्रेडिट साइबरिटी को जाता है
tr A-Z a-z
भी काम करेगा।
यह एक शुद्ध बैश समाधान नहीं है, लेकिन आप अपने तारों को पाइप कर सकते हैं perl
(जैसा कि ओली ने किया था sed
):
$ echo lowercase | perl -ne 'print "\U$_"'
LOWERCASE
और \L
विपरीत प्रभाव पड़ेगा:
$ echo UPPERCASE | perl -ne 'print "\L$_"'
uppercase
इस सरल आदेश का उपयोग करें ऊपरी से निचले मामले के लिए जहाँ 'f' फ़ाइल नाम है जहाँ आप रूपांतरण करना चाहते हैं।
tr "A-Z" "a-z" < f
निचले से ऊपरी मामले के लिए
tr "a-z" "A-Z" < f