कमांड लाइन तर्क को कैसे बड़ा करें?


125

मैंने एसओ को खोजा और पाया कि एक स्ट्रिंग के लिए अपरकेस काम करेगा

str="Some string"
echo ${str^^}

लेकिन मैंने कमांड-लाइन तर्क पर एक समान काम करने की कोशिश की, जिसने मुझे निम्नलिखित त्रुटि दी

कोशिश की

#!/bin/bash
             ## Output
echo ${1^^}  ## line 3: ${1^^}: bad substitution
echo {$1^^}  ## No error, but output was still smaller case i.e. no effect

हम यह कैसे कर सकते हैं?


8
यह मेरे लिए ठीक काम करता है। अपनी पूरी स्क्रिप्ट पोस्ट करें, त्रुटि शायद कहीं और है। क्या आपका शेबंग इशारा कर रहा है bash?
— मैनटवर्क

संभव के रूप में ही: stackoverflow.com/questions/2264428/…
— Ciro Santilli 新疆 over over over

जवाबों:


151

सिंटैक्स str^^जो आप कोशिश कर रहे हैं वह बैश 4.0 और उससे ऊपर से उपलब्ध है। शायद तुम्हारा एक पुराना संस्करण है (या आपने स्क्रिप्ट को shस्पष्ट रूप से चलाया ):

इसे इस्तेमाल करे:

str="Some string"
printf '%s\n' "$str" | awk '{ print toupper($0) }'

1
Mtk के शब्दों से मुझे समझ में आया कि केस संशोधन वास्तव में चर के साथ उसके लिए काम करता है।
— मैनटवर्क

1
@manatwork प्रारंभिक प्रश्न में स्पष्ट रूप से नहीं बताया गया है। खराब प्रतिस्थापन त्रुटि संदेश वही है जो आपको पुराने बैश संस्करणों के साथ मिलेगा।
— बर्नहार्ड

4
तुम सही हो। मैंने संस्करण की जाँच की, इसका 3.2.25। आपका समाधान काम करता है और मैंने भी कोशिश की tr '[a-z]' [[A-Z]'।
— mtk

20
@ एमटीके वह होना चाहिए tr '[a-z]' '[A-Z]'।
— l0b0

2
मैं भाग रहा हूं GNU bash, version 4.3.42(1)-release (x86_64-apple-darwin14.5.0), और मुझे ओपी के समान त्रुटि मिलती है, इसलिए मुझे नहीं लगता कि यह किसी भी bash4.0 और इसके बाद के संस्करण पर उपलब्ध है जैसा कि आप कहते हैं।
— हीथ बॉर्डर्स

79
echo "lowercase" | tr a-z A-Z

आउटपुट:

LOWERCASE

1
मुझे लगता /है tr /a-z/ /A-Z/कि मेरे संपादन से पहले POSIX की आवश्यकता नहीं है : यह सिर्फ इसलिए काम करता है क्योंकि यह बेकार /है, /लेकिन यह बेकार है: pubs.opengroup.org/onlinepubs/9699919799/utilities/tr.html अधिक अस्पष्ट और कम उपयोगी भी मौजूद है tr '[:lower:]' '[:upper:]'।
— सिरो सेंटिल्ली 新疆 改造 iro i 事件 '

सही बात। tr बहुत अलग है, लेकिन यह काम करता है।
— डग

umlauts इसके साथ काम नहीं कर रहे हैं।
— एवगेनी

22

जब तक AZ आप उपयोग नहीं करते तब तक tr के साथ सावधान रहें। अन्य स्थानों के लिए भी '[: निचला:]' ': ऊपरी:]' विफल हो जाता है, केवल awk का टॉपर और बाश (v4 +) कार्य करता है

$ str="abcåäö"
$ echo "$str"|tr '/a-z/' '/A-Z/'
ABCåäö
$ echo "$str"|LC_ALL=sv_SE tr '[:lower:]' '[:upper:]'
ABCåäö
$ echo "$str"|awk '{print toupper($0)}'
ABCÅÄÖ
$ echo ${str^^} # Bash 4.0 and later
ABCÅÄÖ
$ STR="ABCÅÄÖ"
$ echo ${STR,,}
abcåäö

1
एफडब्ल्यूआईडब्ल्यू, tr '[:lower:]' '[:upper:]'ओएस एक्स पर आपके उदाहरण के लिए अब कम से कम (साथ में LC_ALL=sv_SE)
— एथन

1

वैकल्पिक रूप से, आप ksh या zsh जो दशकों (काफी समय पहले के लिए मामला रूपांतरण समर्थन पड़ा है करने के लिए स्विच कर सकता है bash's ${var^^}एक अलग वाक्य रचना के साथ हालांकि 4.0 में जोड़ा गया),:

#! /bin/ksh -
typeset -u upper="$1"
printf '%s\n' "$upper"

(यह भी काम करता है zsh; ध्यान दें कि pdksh / mksh में, यह केवल ASCII अक्षरों के लिए काम करता है)।

इसके साथ zsh, आप Uपैरामीटर विस्तार ध्वज का भी उपयोग कर सकते हैं :

#! /bin/zsh -
printf '%s\n' "${(U)1}"

पूरी तरह से, आप उपयोग कर सकते हैं:

awk 'BEGIN{print toupper(ARGV[1])}' "$1"

वहाँ भी:

printf '%s\n' "$1" | tr '[:lower:]' '[:upper:]'

लेकिन जीएनयू सहित कुछ कार्यान्वयन में, trयह केवल एकल-बाइट वर्णों के लिए काम करता है (इसलिए UTF-8 स्थानों में, केवल ASCII पत्रों पर)।


0

यदि किसी को अभी भी त्रुटि की कोशिश हो रही है ${str^^}, तो आप कोशिश कर सकते हैं python -cया perlइसकी संभावना है क्योंकि बैश संस्करण 4 से कम है।

लेकिन, अब तक मौजूदा समाधान के साथ 4 बैश या उससे अधिक तेजी से काम कर रहा है।

L2U="I will be upper"

python -cबाश में उपयोग करना

python -c "print('$L2U'.upper())"
I WILL BE UPPER

इसी तरह इसका उपयोग पूंजीकरण के साथ भी किया जा सकता है :

service="bootup.sh on home"
python -c "print('$service'.capitalize())"
Bootup.sh on home

का उपयोग करते हुए perl

echo $L2U | perl -ne 'print "\U$_"'
I WILL BE UPPER
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.