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


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.