ব্যাশের সাথে ভেরিয়েবলের বড় অক্ষর বড় অক্ষর


162

আমি বাশ দিয়ে আমার স্ট্রিংয়ের প্রথম চরিত্রটি বড়হাতে চাই।

foo="bar";

//uppercase first character

echo $foo;

"বার" মুদ্রণ করা উচিত;


1
এটি হুবহু সদৃশ নয়, তবে বাশ শেল স্ক্রিপ্টিংয়ের স্ট্রিংকে লোয়ার কেসে রূপান্তর করতে বর্ণিত অনেকগুলি কৌশলও এই সমস্যার জন্য প্রয়োগ করা যেতে পারে।
pjh

উত্তর:


148
foo="$(tr '[:lower:]' '[:upper:]' <<< ${foo:0:1})${foo:1}"

2
সেরা রান করা উত্তরের চেয়ে জটিল হওয়া সত্ত্বেও, এটি আসলে ঠিক সেইটাই করে: 'একটি ভেরিয়েবলের বড় অক্ষর'। সেরা স্কোর উত্তরের ফলাফল নেই। দেখে মনে হচ্ছে যে সহজ উত্তরগুলি সঠিক উত্তরগুলির চেয়ে আরও স্বেচ্ছায় আপগেট করা আছে?
Krzysztof Jabłoński

15
@ ক্রিজিস্তফফ জাবোসস্কি: প্রকৃতপক্ষে, নীচে "সেরা স্কোর করা উত্তর" এই উত্তরটি বাশ ৪ এর অধীনে একই ফলাফল আনবে answer এই উত্তরে একটি সাবশেল (অন্য শেল) কল করার ওভারহেড রয়েছে, 'টিআর' ইউটিলিটি কল করার ওভারহেড (অন্য প্রক্রিয়া) , বাশ নয়), এখানে-ডক / স্ট্রিং (অস্থায়ী ফাইল তৈরি) ব্যবহারের ওভারহেড এবং এটি সেরা রানের উত্তরের তুলনায় দুটি বিকল্প ব্যবহার করে। আপনার যদি অবশ্যই লিগ্যাসি কোডটি লিখতে হয় তবে সাব-শেলের পরিবর্তে কোনও ফাংশন ব্যবহার করে বিবেচনা করুন।
স্টিভ

2
এই উত্তরটি অনুমান করে যে ইনপুটটি সমস্ত ছোট ক্ষেত্রে রয়েছে। এই রূপটির কোনও অনুমান নেই: $ (টিআর '[: নিম্ন:]' '[: উচ্চতর:]' <<< $ oo ফু: 0: 1}) $ (ত্রি '[: উচ্চতর:]' '[: নিম্ন: ] '<<< $
oo ফু

5
@ ইতাইহানসকি ওপিতে বাকী অক্ষরগুলির কী হবে তা সুনির্দিষ্টভাবে উল্লেখ করেনি, কেবল প্রথমটি। মনে করুন তারা পরিবর্তিত notQuiteCamelহতে চেয়েছিল NotQuiteCamel। আপনার বৈকল্পিকের পার্শ্ব প্রতিক্রিয়া রয়েছে বা বাকী ছোট হাতের কাছে বাধ্য করা হচ্ছে - সাব শেল এবং টিআর প্রক্রিয়াগুলির সংখ্যা দ্বিগুণ করার জন্য at
জেসি চিশলম

3
@ ড্যানিয়েল অরল্যান্ডো, সত্য, তবে এই প্রশ্নটি ছাড়া অন্য কোনও ট্যাগ নেই bash
চার্লস ডাফি

313

ব্যাশ সহ একটি উপায় (সংস্করণ 4+):

foo=bar
echo "${foo^}"

কপি করে প্রিন্ট:

Bar

2
এর বিপরীত কি আছে?
সিএমসিডিগ্রাগনকাই

44
@ সিএমসিডিগ্রাগনকাই: প্রথম অক্ষর ছোট করতে, ব্যবহার করুন "${foo,}"। সমস্ত অক্ষর ছোট করতে, ব্যবহার করুন "${foo,,}"। সমস্ত অক্ষর বড় করতে, ব্যবহার করুন "${foo^^}"
স্টিভ

1
আমি ঘটনাক্রমে যে লক্ষ্য ${foo~}এবং ${foo~~}হিসাবে একই প্রভাব আছে ${foo^}এবং ${foo^^}। তবে আমি বিকল্পটি কোথাও উল্লেখ করে দেখিনি।
mivk

5
এটি ম্যাকগুলিতে কাজ করবে বলে মনে হচ্ছে না। নিম্নলিখিত ত্রুটিটি পেয়েছে:bad substitution
টোল্যান্ড হ্যান

1
@ টোল্যান্ডহন: আপনি সম্ভবত ইতিমধ্যে কাজ শেষ করে ফেলেছেন, আপনাকে 4.x সংস্করণে আপগ্রেড করতে হবে বা যদি কোনও কারণে সেই মেশিনটি আপগ্রেড করা না যায় তবে অন্য সমাধানের চেষ্টা করতে হবে।
স্টিভ

29

এর সাথে একটি উপায় sed:

echo "$(echo "$foo" | sed 's/.*/\u&/')"

ছাপে:

Bar

10
MacOS10 সিংহটিতে কাজ করে না দীর্ঘশ্বাস ফেলুন, আপনি অপারেটর হওয়ার পরিবর্তে আপনার প্রসারিত হন।
vwvan

2
@vwvan brew install coreutils gnu-sedএবং উপসর্গ ছাড়া কমান্ড ব্যবহার করার জন্য নির্দেশাবলী অনুসরণ করুন g। এটি মূল্যবান কিসের জন্য জিএনইউ সংস্করণ পাওয়ার পরে আমি কখনই এই কমান্ডগুলির ওএসএক্স সংস্করণটি চালাতে চাইনি।
ডিন

@ ভোভান: হ্যাঁ, দুঃখিত, আপনার sedএই পরিস্থিতিতে জিএনইউ প্রয়োজন হবে
স্টিভ

2
@ ডিয়ান: এফডাব্লুআইডাব্লু, আমি কখনই ওএসএক্স :-) চালাতে চাইনি
স্টিভ

5
কেবল এটিকে পরিবর্তন করুন sed 's/./\U&/এবং এটি পসিক্স সেডে কাজ করবে।
ডেভিড কনরাড


14

এখানে "নেটিভ" পাঠ্য সরঞ্জামগুলির উপায়:

#!/bin/bash

string="abcd"
first=`echo $string|cut -c1|tr [a-z] [A-Z]`
second=`echo $string|cut -c2-`
echo $first$second

অবশেষে এমন কিছু যা ভেরিয়েবলের সাথে এবং ম্যাকের সাথে কাজ করে! ধন্যবাদ!
ওজজিআইই

4
পছন্দ করুন tr [:lower:] [:upper:]যদি ভাষা / লোকেলগুলিতে বর্ণ a-zবা বর্ণের অন্তর্ভুক্ত না হয় এমন একটি অক্ষর অন্তর্ভুক্ত করে কাজ করতে হয় তবে এটি একটি ভাল পছন্দ A-Z
চার্লস ডাফি


4

এটি bash-3.2 এর সাথে খাঁটি ব্যাশেও করা যেতে পারে:

# First, get the first character.
fl=${foo:0:1}

# Safety check: it must be a letter :).
if [[ ${fl} == [a-z] ]]; then
    # Now, obtain its octal value using printf (builtin).
    ord=$(printf '%o' "'${fl}")

    # Fun fact: [a-z] maps onto 0141..0172. [A-Z] is 0101..0132.
    # We can use decimal '- 40' to get the expected result!
    ord=$(( ord - 40 ))

    # Finally, map the new value back to a character.
    fl=$(printf '%b' '\'${ord})
fi

echo "${fl}${foo:1}"

কিভাবে foo সংজ্ঞায়িত করতে? আমি চেষ্টা করেছি foo = $1তবে আমি পেয়েছি-bash: foo: command not found
ওজজিআইই

1
@ ওজজিআইই, =অ্যাসাইনমেন্টগুলির আশেপাশে কোনও স্থান নেই । এটি এমন একটি বিষয় যা শেলচেক.net আপনার জন্য প্রগ্রেমেটিকভাবে খুঁজে পাবে।
চার্লস ডাফি

আমি সর্বদা এটি ভুলে যাই শেল স্ক্রিপ্টগুলি সম্পর্কে .. কেবলমাত্র এমন এক ভাষা যেখানে একটি স্থান (আগে / পরে) গুরুত্বপূর্ণ ... দীর্ঘশ্বাস ফেলে (
পাইথনটি

@OZZIE, এটা হয়েছে ব্যাপার, যদি এটা কোন ব্যাপার না, আপনি পাস করতে পারে না কারণ =একটি প্রোগ্রাম একটি আর্গুমেন্ট হিসাবে (কিভাবে এটা যদি জানেন যে অনুমিত হয় someprogram =চলমান someprogram, অথবা নামক একটি পরিবর্তনশীল যাও বরাদ্দ someprogram?)
চার্লস ডাফি

3

এটিও কাজ করে ...

FooBar=baz

echo ${FooBar^^${FooBar:0:1}}

=> Baz
FooBar=baz

echo ${FooBar^^${FooBar:1:1}}

=> bAz
FooBar=baz

echo ${FooBar^^${FooBar:2:2}}

=> baZ

ইত্যাদি।

সূত্র:

Inroductions / টিউটোরিয়াল:


3

শুধুমাত্র প্রথম শব্দটি মূলধন করতে:

foo='one two three'
foo="${foo^}"
echo $foo

নে দুই তিন


চলক প্রতিটি শব্দ মূলধন করতে :

foo="one two three"
foo=( $foo ) # without quotes
foo="${foo[@]^}"
echo $foo

নে টি ওয়া টি হ্রি


(ব্যাশ 4+ এ কাজ করে)


foo='one two three'; foo=$(for i in $foo; do echo -n "${i^} "; done) প্রতিটি শব্দের জন্য সংক্ষিপ্ত রেজোলিউশন। foo এখন "ওয়ান টু থ্রি"
vr286

বড় হাতের অক্ষরে আমি কীভাবে প্রথম 3 বা 4 অক্ষরকে বড় করে তুলতে পারি? PQRS-123-v1 থেকে pqrs-123-v1 এর মতো ? অথবা আপনি বলতে পারেন, প্রথম হাইফেনের আগে সমস্ত অক্ষর ...
ভিকি দেব

2

লিনাক্স এবং ওএসএক্স উভয়ের জন্য বিকল্প এবং পরিষ্কার সমাধান, এটি ব্যাশ ভেরিয়েবলগুলির সাথেও ব্যবহার করা যেতে পারে

python -c "print(\"abc\".capitalize())"

Abc ফেরত দেয়


0

এই একজন আমার পক্ষে কাজ করেছেন:

বর্তমান ডিরেক্টরিতে সমস্ত * পিএইচপি ফাইল অনুসন্ধান করা এবং প্রতিটি ফাইলের নামের প্রথম অক্ষরকে মূল অক্ষরে প্রতিস্থাপন করুন:

যেমন: test.php => Test.php

for f in *php ; do mv "$f" "$(\sed 's/.*/\u&/' <<< "$f")" ; done

4
মূল প্রশ্নটি একটি স্ট্রিং ছিল এবং ফাইলগুলির নাম পরিবর্তন করার বিষয়ে কোনও রেফারেন্স দেয়নি।
অ্যান্ডিসেজেজ

0

শুধু মজাদার জন্য এখানে আপনি:

foo="bar";    

echo $foo | awk '{$1=toupper(substr($1,0,1))substr($1,2)}1'
# or
echo ${foo^}
# or
echo $foo | head -c 1 | tr [a-z] [A-Z]; echo $foo | tail -c +2
# or
echo ${foo:1} | sed -e 's/^./\B&/'

0

ঠিক যা চেয়েছিল তা নয় তবে বেশ সহায়ক

declare -u foo #When the variable is assigned a value, all lower-case characters are converted to upper-case.

foo=bar
echo $foo
BAR

এবং বিপরীত

declare -l foo #When the variable is assigned a value, all upper-case characters are converted to lower-case.

foo=BAR
echo $foo
bar

-1
first-letter-to-lower () {
        str="" 
        space=" " 
        for i in $@
        do
                if [ -z $(echo $i | grep "the\|of\|with" ) ]
                then
                        str=$str"$(echo ${i:0:1} | tr  '[A-Z]' '[a-z]')${i:1}$space" 
                else
                        str=$str${i}$space 
                fi
        done
        echo $str
}
first-letter-to-upper-xc () {
        v-first-letter-to-upper | xclip -selection clipboard
}
first-letter-to-upper () {
        str="" 
        space=" " 
        for i in $@
        do
                if [ -z $(echo $i | grep "the\|of\|with" ) ]
                then
                        str=$str"$(echo ${i:0:1} | tr  '[a-z]' '[A-Z]')${i:1}$space" 
                else
                        str=$str${i}$space 
                fi
        done
        echo $str
}

প্রথম-বর্ণ-থেকে-নিম্ন-এক্সসি () {ভি-প্রথম-বর্ণ-থেকে-নীচে | এক্সক্লিপ-নির্বাচন ক্লিপবোর্ড}


-7

প্রথম চরিত্রটি যদি কোনও চিঠি না হয় (তবে একটি ট্যাব, একটি স্থান এবং একটি পালিয়ে যাওয়া ডাবল উদ্ধৃতি)? আমরা কোনও চিঠি না পাওয়া পর্যন্ত এটি আরও ভাল করে পরীক্ষা করব ! তাই:

S='  \"ó foo bar\"'
N=0
until [[ ${S:$N:1} =~ [[:alpha:]] ]]; do N=$[$N+1]; done
#F=`echo ${S:$N:1} | tr [:lower:] [:upper:]`
#F=`echo ${S:$N:1} | sed -E -e 's/./\u&/'` #other option
F=`echo ${S:$N:1}
F=`echo ${F} #pure Bash solution to "upper"
echo "$F"${S:(($N+1))} #without garbage
echo '='${S:0:(($N))}"$F"${S:(($N+1))}'=' #garbage preserved

Foo bar
= \"Foo bar=

6
ক্লিনার কোড লিখুন দয়া করে! আপনার কাছে পুরো জায়গার কোটগুলির অভাব রয়েছে আপনি অপ্রচলিত সিনট্যাক্স (ব্যাকটিক্স) ব্যবহার করছেন; আপনি অ্যান্টিকিটেড সিনট্যাক্স ( $[...]) ব্যবহার করছেন । আপনি প্রচুর অকেজো বন্ধনী ব্যবহার করছেন। আপনি ধরে নিচ্ছেন যে স্ট্রিংটিতে লাতিন বর্ণমালার অক্ষর রয়েছে (উচ্চারণের অক্ষর, বা অন্যান্য বর্ণমালায় বর্ণগুলি কীভাবে?) এই স্নিপেটটি ব্যবহারের উপযোগী করে তোলার জন্য আপনার প্রচুর কাজ রয়েছে! (এবং যেহেতু আপনি রেজেক্স ব্যবহার করছেন, আপনি লুপের পরিবর্তে প্রথম অক্ষরটি সন্ধান করতে পুনরায় ব্যবহার করতে পারেন)।
gniourf_gniourf

6
আমি মনে করি আপনি ভুল এটি বাধ্যতামূলক মন্তব্য যা ডাউনভোটের সাথে রয়েছে, উত্তরের সমস্ত ভুল নিদর্শন এবং ভুল ধারণা ব্যাখ্যা করে। অনুগ্রহ করে, নিজের ভুলগুলি থেকে শিখুন (এবং তার আগে, সেগুলি বোঝার চেষ্টা করুন) অনড় হওয়ার পরিবর্তে। ভাল সহকর্মী হওয়া খারাপ অভ্যাসগুলি ছড়িয়ে দেওয়ার সাথেও বেমানান।
gniourf_gniourf

1
বা, যদি বাশ ≥4 ব্যবহার করে থাকেন তবে আপনার প্রয়োজন নেই tr:if [[ $S =~ ^([^[:alpha:]]*)([[:alpha:]].*) ]]; then out=${BASH_REMATCH[1]}${BASH_REMATCH[2]^}; else out=$S; fi; printf '%s\n' "$out"
gniourf_gniourf

5
এই কোডটি এখনও খারাপভাবে ভেঙে গেছে। এটি এখনও আধুনিক প্রতিস্থাপন সিনট্যাক্সের পরিবর্তে ব্যাকটিক্স ব্যবহার করছে; এটির সাথে এখনও মিল নেই es এটি এখনও সেই জায়গাগুলিতে উদ্ধৃতি হারিয়েছে যেখানে তারা বাস্তবে গুরুত্বপূর্ণ ; ইত্যাদি। আপনার পরীক্ষার ডেটাতে কিছু শ্বেত স্পেস-ঘেরা বিশ্বব্যাপী অক্ষরগুলি রাখার চেষ্টা করুন, যদি আপনি বিশ্বাস করেন না যে এই অনুপস্থিত উদ্ধৃতিগুলি কোনও পার্থক্যের সৃষ্টি করে, এবং এই কোডটি পরিষ্কার না হওয়া পর্যন্ত শেলচেক.টেনের সমস্যাগুলি সমাধান করুন ।
চার্লস ডাফি

2
আপনি যে ভাষাটি ইউনিক্স.স্ট্যাকেক্সেঞ্জার.কম / সেকশনস / 696869৯৪/২ থেকে উদ্ধৃত করেছেন , আপনি যেটি মিস করছেন তা echo $fooহ'ল পার্সার শব্দের একটি তালিকা প্রত্যাশা করে এমন একটি পরিস্থিতির উদাহরণ ; সুতরাং আপনার echo ${F}মধ্যে বিষয়বস্তু Fস্ট্রিং বিভক্ত এবং গ্লোব-প্রসারিত হয়। echo ${S:$N:1}উদাহরণ এবং বাকী সমস্ত ক্ষেত্রে এটি একইভাবে সত্য । দেখুন BashPitfalls # 14
চার্লস ডাফি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.