বাশে কিভাবে একটি স্ট্রিং লোয়ার কেসে রূপান্তর করবেন?


1252

ভিতরে কোন উপায় আছে? একটি স্ট্রিংকে লোয়ার কেস স্ট্রিংয়ে রূপান্তর করতে?

উদাহরণস্বরূপ, যদি আমার কাছে থাকে:

a="Hi all"

আমি এটিকে রূপান্তর করতে চাই:

"hi all"

1
আরও দেখুন : stackoverflow.com/questions/11392189
dreftymac

উত্তর:


2179

বিভিন্ন উপায়:

পসিক্স স্ট্যান্ডার্ড

TR

$ echo "$a" | tr '[:upper:]' '[:lower:]'
hi all

awk

$ echo "$a" | awk '{print tolower($0)}'
hi all

অ POSIX

আপনি নিম্নলিখিত উদাহরণগুলির সাথে বহনযোগ্যতার সমস্যাগুলিতে চলে যেতে পারেন:

বাশ 4.0

$ echo "${a,,}"
hi all

sed

$ echo "$a" | sed -e 's/\(.*\)/\L\1/'
hi all
# this also works:
$ sed -e 's/\(.*\)/\L\1/' <<< "$a"
hi all

পার্ল

$ echo "$a" | perl -ne 'print lc'
hi all

সজোরে আঘাত

lc(){
    case "$1" in
        [A-Z])
        n=$(printf "%d" "'$1")
        n=$((n+32))
        printf \\$(printf "%o" "$n")
        ;;
        *)
        printf "%s" "$1"
        ;;
    esac
}
word="I Love Bash"
for((i=0;i<${#word};i++))
do
    ch="${word:$i:1}"
    lc "$ch"
done

দ্রষ্টব্য: এটিতে ওয়াইএমএমভি। এমনকি ব্যবহার করেও (জিএনইউ বাশ সংস্করণ 4.2.46 এবং 4.0.33 (এবং একই আচরণ 2.05b.0 তবে নোকাসেম্যাচ বাস্তবায়ন করা হয়নি)) কাজ করে না shopt -u nocasematch;। এই নোকাসেম্যাচটি সেট না করে [["fooBaR" == "FOObar"]] ঠিকঠাক BUT এর সাথে মিলিয়ে যায় বিস্মৃতভাবে [bz] [AZ] এর সাথে ভুলভাবে মিলেছে। ডাবল নেগেটিভ ("আনসেটিং নোকাসেম্যাচ") দ্বারা বাশ বিভ্রান্ত! :-)


9
আমি কি কিছু মিস করছি, বা আপনার শেষ উদাহরণটি (বাশ-এ) আসলে সম্পূর্ণ ভিন্ন কিছু করেছে? এটি হবে "ABX" জন্য কাজ করে, কিন্তু যদি আপনি পরিবর্তে word="Hi All"অন্যান্য উদাহরণ মত, এটা ফেরৎ haনা hi all। এটি কেবলমাত্র মূলধর্মী অক্ষরের জন্য কাজ করে এবং ইতিমধ্যে নিম্ন-বর্ণিত অক্ষরগুলি এড়িয়ে যায়।
jangosteve

26
নোট করুন যে কেবল trএবং awkউদাহরণগুলি পসিক্স স্ট্যান্ডার্ডে নির্দিষ্ট করা আছে।
রিচার্ড হ্যানসেন

178
tr '[:upper:]' '[:lower:]'বড় হাতের অক্ষর / ছোট হাতের সমতুল্য নির্ধারণের জন্য বর্তমান লোকেল ব্যবহার করবে, সুতরাং এটি লোকালগুলির সাথে কাজ করবে যা ডায়াক্রিটিকাল চিহ্ন সহ অক্ষর ব্যবহার করে।
রিচার্ড হ্যানসেন

10
কিভাবে একটি নতুন পরিবর্তনশীল মধ্যে আউটপুট পেতে? আমি বলি যে আমি নিম্নচিকিত স্ট্রিংটিকে একটি নতুন ভেরিয়েবলে রূপ দিতে চাই?
অ্যাডাম পার্কিন

60
@ অ্যাডাম:b="$(echo $a | tr '[A-Z]' '[a-z]')"
টিনো

434

বাশ 4 এ:

ছোট করতে

$ string="A FEW WORDS"
$ echo "${string,}"
a FEW WORDS
$ echo "${string,,}"
a few words
$ echo "${string,,[AEIUO]}"
a FeW WoRDS

$ string="A Few Words"
$ declare -l string
$ string=$string; echo "$string"
a few words

বড়হাতে

$ string="a few words"
$ echo "${string^}"
A few words
$ echo "${string^^}"
A FEW WORDS
$ echo "${string^^[aeiou]}"
A fEw wOrds

$ string="A Few Words"
$ declare -u string
$ string=$string; echo "$string"
A FEW WORDS

টগল করুন (সংকলনের সময় অননুমোদিত, তবে allyচ্ছিকভাবে কনফিগারযোগ্য)

$ string="A Few Words"
$ echo "${string~~}"
a fEW wORDS
$ string="A FEW WORDS"
$ echo "${string~}"
a FEW WORDS
$ string="a few words"
$ echo "${string~}"
A few words

মূলধন (সংকলনের সময় অননুমোদিত, তবে configচ্ছিকভাবে কনফিগারযোগ্য)

$ string="a few words"
$ declare -c string
$ string=$string
$ echo "$string"
A few words

শিরোনাম কেস:

$ string="a few words"
$ string=($string)
$ string="${string[@]^}"
$ echo "$string"
A Few Words

$ declare -c string
$ string=(a few words)
$ echo "${string[@]}"
A Few Words

$ string="a FeW WOrdS"
$ string=${string,,}
$ string=${string~}
$ echo "$string"
A few words

কোনও declareবৈশিষ্ট্য বন্ধ করতে , ব্যবহার করুন +। উদাহরণস্বরূপ declare +c string,। এটি পরবর্তী মানগুলি প্রভাবিত করে বর্তমান মানকে নয়।

declareঅপশন ভেরিয়েবলের অ্যাট্রিবিউট, কিন্তু না বিষয়বস্তু পরিবর্তন করুন। আমার উদাহরণগুলিতে পুনরায় নিয়োগগুলি পরিবর্তনগুলি দেখানোর জন্য সামগ্রীগুলি আপডেট করে।

সম্পাদনা:

( "শব্দ দ্বারা প্রথম অক্ষর টগল" যোগ করা হয়েছে ${var~}) হিসেবে দ্বারা প্রস্তাবিত ghostdog74

সম্পাদনা করুন: বাশ ৪.৩-এর সাথে মেলে টিলডের আচরণটি সংশোধন করা হয়েছে।


5
বেশ বিজ্জার, "^^" এবং ",," অপারেটররা নন-এসসিআইআই অক্ষরগুলিতে কাজ করে না তবে "~~" করে ... সুতরাং string="łódź"; echo ${string~~}"ŁÓDŁÓ" ফিরে আসবে, তবে echo ${string^^}"źDłó" প্রদান করবে। এমনকি ভিতরে LC_ALL=pl_PL.utf-8। এটি ব্যাশ 4.2.24 ব্যবহার করছে।
হুবার্ট কারিও

2
@ হুবার্টকারিও: এটি অদ্ভুত। এটি আমার কাছে একই স্ট্রিং সহ 4.0.3.33 তে একই en_US.UTF-8। এটি একটি বাগ এবং আমি এটি রিপোর্ট করেছি।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

1
@ হুবার্টকারিও: চেষ্টা করুন echo "$string" | tr '[:lower:]' '[:upper:]'। এটি সম্ভবত একই ব্যর্থতা প্রদর্শন করবে। সুতরাং সমস্যাটি কমপক্ষে আংশিকভাবে বাশের নয়।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

1
@ ডেনিসউইলিয়ামসন: হ্যাঁ, আমি সে বিষয়টিও লক্ষ্য করেছি (শুভালভ উত্তরের মন্তব্য দেখুন)। আমি কেবল বলেছিলাম, "এই জিনিসগুলি কেবল ASCII এর জন্য" তবে এটি "then" অপারেটর যা কাজ করে, তাই কোড এবং অনুবাদ সারণি ইতিমধ্যে সেখানে নেই ...
হুবার্ট কারিও

4
@ হুবার্টকারিও: বাশ রক্ষণাবেক্ষণকারী বাগটি স্বীকার করেছেন এবং জানিয়েছেন যে এটি পরবর্তী প্রকাশে স্থির করা হবে।
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

123
echo "Hi All" | tr "[:upper:]" "[:lower:]"

4
@ রিচার্ডহানসেন: এসিআইবিবিহীন চরিত্রগুলির trজন্য আমার পক্ষে কাজ করে না। আমার কাছে সঠিক লোকেল সেট এবং লোকেল ফাইল উত্পন্ন হয়েছে। আমি কি ভুল হতে পারে কোন ধারণা আছে?
হুবার্ট কারিও

এফওয়াইআই: এটি উইন্ডোজ / এমসিসে কাজ করেছে। অন্যান্য পরামর্শের কিছু না।
wasatchwizard

3
কেন [:upper:]দরকার?
মিলাগুট

77

tr :

a="$(tr [A-Z] [a-z] <<< "$a")"

এডাব্লুকে :

{ print tolower($0) }

সেড :

y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/

2
+1 a="$(tr [A-Z] [a-z] <<< "$a")"আমার কাছে সবচেয়ে সহজ দেখাচ্ছে। আমি এখনও একটি শিক্ষানবিস ...
সন্দীপন নাথ

2
আমি দৃ strongly়ভাবে sedসমাধানের সুপারিশ করছি ; আমি এমন একটি পরিবেশে কাজ করে যাচ্ছি যে কোনও কারণে নেই trতবে আমি এখনও ছাড়া একটি সিস্টেম খুঁজে পেয়েছি sed, আরও অনেক সময় আমি এটি করতে চাই আমি কেবল অন্যভাবে কিছু করেছি sedতাই চেইন করতে পারি কমান্ডগুলি একক (দীর্ঘ) বিবৃতিতে একত্রিত হয়।
হারাভিক্ক

2
বন্ধনী এক্সপ্রেশন উদ্ধৃতি করা উচিত। ইন tr [A-Z] [a-z] A, শেল ফাইলের নাম প্রসারণ সম্পাদন করতে পারে যদি কোনও অক্ষর বা নলবব সমন্বিত ফাইলের নাম থাকে । tr "[A-Z]" "[a-z]" Aসঠিকভাবে আচরণ করবে।
ডেনিস

2
@ ক্যামিলোমার্টিন এটি একটি ব্যাসিবক্স সিস্টেম যেখানে আমার এই সমস্যাটি হচ্ছে, বিশেষত সিএনোলজি নাসেস, তবে আমি অন্যান্য কয়েকটি সিস্টেমেও এটির মুখোমুখি হয়েছি। আমি ইদানীং প্রচুর ক্রস-প্ল্যাটফর্ম শেল স্ক্রিপ্টিং করছি এবং অতিরিক্ত কিছু ইনস্টল না করা দরকার যা জিনিসগুলি খুব জটিল করে তোলে! তবে আমি এখনও কোনও সিস্টেমের মুখোমুখি sed
হইনি

2
নোটটি tr [A-Z] [a-z]প্রায় সব লোকেলের মধ্যেই ভুল। উদাহরণস্বরূপ, en-USলোকালয়ে, A-Zআসলে অন্তর অন্তর AaBbCcDdEeFfGgHh...XxYyZ
ফুজ

44

আমি জানি এটি একটি পুরানো পোস্ট তবে আমি এই উত্তরটি অন্য সাইটের জন্য তৈরি করেছিলাম তাই আমি ভেবেছিলাম এটি এখানে পোস্ট করব:

আপের -> নিম্ন : পাইথন ব্যবহার করুন:

b=`echo "print '$a'.lower()" | python`

বা রুবি:

b=`echo "print '$a'.downcase" | ruby`

বা পার্ল (সম্ভবত আমার প্রিয়):

b=`perl -e "print lc('$a');"`

বা পিএইচপি:

b=`php -r "print strtolower('$a');"`

বা আওক:

b=`echo "$a" | awk '{ print tolower($1) }'`

বা শেড:

b=`echo "$a" | sed 's/./\L&/g'`

বা বাশ 4:

b=${a,,}

বা যদি আপনার কাছে থাকে তবে নোডজেএস (এবং কিছুটা বাদাম ...):

b=`echo "console.log('$a'.toLowerCase());" | node`

আপনি ব্যবহার করতে পারেন dd(কিন্তু আমি না!):

b=`echo "$a" | dd  conv=lcase 2> /dev/null`

নিম্ন -> উচ্চতর :

অজগর ব্যবহার:

b=`echo "print '$a'.upper()" | python`

বা রুবি:

b=`echo "print '$a'.upcase" | ruby`

বা পার্ল (সম্ভবত আমার প্রিয়):

b=`perl -e "print uc('$a');"`

বা পিএইচপি:

b=`php -r "print strtoupper('$a');"`

বা আওক:

b=`echo "$a" | awk '{ print toupper($1) }'`

বা শেড:

b=`echo "$a" | sed 's/./\U&/g'`

বা বাশ 4:

b=${a^^}

বা যদি আপনার কাছে থাকে তবে নোডজেএস (এবং কিছুটা বাদাম ...):

b=`echo "console.log('$a'.toUpperCase());" | node`

আপনি ব্যবহার করতে পারেন dd(কিন্তু আমি না!):

b=`echo "$a" | dd  conv=ucase 2> /dev/null`

এছাড়াও যখন আপনি 'শেল' বলছেন তখন আমি আপনার অর্থ বোঝাচ্ছি bashতবে আপনি যদি zshএটি ব্যবহার করতে পারেন তবে এটি এতটা সহজ

b=$a:l

নিম্ন ক্ষেত্রে এবং

b=$a:u

উপরের ক্ষেত্রে।


@ জেসিই উভয়ই আমার পক্ষে উচ্চ -> নিম্ন এবং নিম্ন-> উচ্চে কাজ করে। আমি bit৪ বিট দেবিয়ান স্ট্রেচে 4.2.2 এবং বাশ 4.3.42 (1) ব্যবহার করছি।
নেটটাক্স

1
হাই, @ নেটটক্স 443 ... আমি কেবল আবার বাশ অপারেশন চেষ্টা করেছি এবং এটি এখনও আমার জন্য ত্রুটি বার্তা "খারাপ প্রতিস্থাপন" দিয়ে ব্যর্থ। আমি হোডব্রিউয়ের ব্যাশ ব্যবহার করে ওএসএক্সে আছি: জিএনইউ ব্যাশ, সংস্করণ 4.3.42 (1) -দোকান (x86_64-আপেল-ডারউইন 14.5.0)
জেসিআই

5
ব্যবহার করবেন না! একটি স্ক্রিপ্ট উত্পন্ন করে যে উদাহরণগুলির সবগুলিই অত্যন্ত ভঙ্গুর; মানটির মধ্যে যদি aএকটি একক উক্তি থাকে তবে আপনার কেবল আচরণই ভাঙ্গা হয়নি, তবে একটি গুরুতর সুরক্ষা সমস্যা।
ট্রিপলিতে

আমি সেড সমাধানটি সবচেয়ে পছন্দ করি, যেহেতু সেড সর্বদা সর্বব্যাপী।
ডুডি বয়

আমি ডিডি সমাধান ব্যবহার পছন্দ করি। দয়া করে মনে রাখবেন এটির কাজ
চালিয়ে


18

জিএনইউ ব্যবহার sed:

sed 's/.*/\L&/'

উদাহরণ:

$ foo="Some STRIng";
$ foo=$(echo "$foo" | sed 's/.*/\L&/')
$ echo "$foo"
some string

12

প্রাক বাশ 4.0

একটি স্ট্রিংয়ের কেসটি লোয়ার করুন এবং ভেরিয়েবলের জন্য বরাদ্দ করুন

VARIABLE=$(echo "$VARIABLE" | tr '[:upper:]' '[:lower:]') 

echo "$VARIABLE"

5
echoপাইপগুলির প্রয়োজন নেই : ব্যবহার করুন$(tr '[:upper:]' '[:lower:]' <<<"$VARIABLE")
টিনো

3
@ টিনো এখানে স্ট্রিংটি বাশের সত্যিকারের পুরানো সংস্করণগুলিতে ফিরে পোর্টেবলও নয়; আমি বিশ্বাস করি এটি v3 সালে চালু হয়েছিল।
ট্রিপলি

1
@ ট্রিপলি আপনি ঠিকই বলেছেন, এটি ব্যাশ -২.০৫ বি তে প্রবর্তিত হয়েছিল - তবে এটি আমার সিস্টেমে সর্বাধিক পুরানো বাশ খুঁজে পেতে পেরেছি
টিনো

11

শুধুমাত্র বিল্টিনগুলি ব্যবহার করে একটি স্ট্যান্ডার্ড শেল (বাশিজম ছাড়াই) জন্য:

uppers=ABCDEFGHIJKLMNOPQRSTUVWXYZ
lowers=abcdefghijklmnopqrstuvwxyz

lc(){ #usage: lc "SOME STRING" -> "some string"
    i=0
    while ([ $i -lt ${#1} ]) do
        CUR=${1:$i:1}
        case $uppers in
            *$CUR*)CUR=${uppers%$CUR*};OUTPUT="${OUTPUT}${lowers:${#CUR}:1}";;
            *)OUTPUT="${OUTPUT}$CUR";;
        esac
        i=$((i+1))
    done
    echo "${OUTPUT}"
}

এবং উপরের ক্ষেত্রে:

uc(){ #usage: uc "some string" -> "SOME STRING"
    i=0
    while ([ $i -lt ${#1} ]) do
        CUR=${1:$i:1}
        case $lowers in
            *$CUR*)CUR=${lowers%$CUR*};OUTPUT="${OUTPUT}${uppers:${#CUR}:1}";;
            *)OUTPUT="${OUTPUT}$CUR";;
        esac
        i=$((i+1))
    done
    echo "${OUTPUT}"
}

আমি অবাক হই যে আপনি যদি এই স্ক্রিপ্টে কিছু বাশিজম না দেন, কারণ এটি ফ্রিবিএসডি sh- তে পোর্টেবল নয়: $ {1: $ ... Bad: খারাপ প্রতিস্থাপন
ডেরিকসন

2
প্রকৃতপক্ষে; সাবস্ট্রিংগুলি ${var:1:1}হ'ল বাশীবাদ।
ট্রিপলি

এই পদ্ধতির বেশ খারাপ পারফরম্যান্স মেট্রিক রয়েছে। আমার উত্তর মেট্রিকের জন্য দেখুন।
দেজে ক্লেটন

9

ব্যাশ 4 এ আপনি টাইপসেট ব্যবহার করতে পারেন

উদাহরণ:

A="HELLO WORLD"
typeset -l A=$A

9

আপনি এটি চেষ্টা করতে পারেন

s="Hello World!" 

echo $s  # Hello World!

a=${s,,}
echo $a  # hello world!

b=${s^^}
echo $b  # HELLO WORLD!

এখানে চিত্র বর্ণনা লিখুন

রেফ: HTTP :


7

নিয়মিত প্রকাশ

আমি যে আদেশটি ভাগ করতে চাইছি তার কৃতিত্ব নিতে চাই তবে সত্যটি আমি এটি http://commandlinefu.com থেকে নিজের ব্যবহারের জন্য পেয়েছি । এটির সুবিধাটি রয়েছে যে আপনি যদি cdনিজের বাড়ির ফোল্ডারের মধ্যে যে কোনও ডিরেক্টরিতে থাকেন তবে তা হ'ল এটি সমস্ত ফাইল এবং ফোল্ডারগুলিকে পুনরাবৃত্তভাবে নিম্ন কেসিতে পরিবর্তন করে দেবে দয়া করে সতর্কতার সাথে ব্যবহার করুন। এটি একটি উজ্জ্বল কমান্ড লাইন ফিক্স এবং বিশেষত আপনি সেই ড্রাইভে অনেকগুলি অ্যালবাম সংরক্ষণ করেছেন useful

find . -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;

আপনি বর্তমান ডিরেক্টরি বা সম্পূর্ণ পাথকে নির্দেশ করে এমন সন্ধানের পরে ডট (।) এর জায়গায় একটি ডিরেক্টরি নির্দিষ্ট করতে পারেন।

আমি আশা করি এই সমাধানটি কার্যকর হিসাবে প্রমাণিত হবে যা এই আদেশটি করে না তা আন্ডারস্কোর সহ স্পেসগুলি প্রতিস্থাপন করে - ওহ, সম্ভবত অন্য সময়।


এটি যে কোনও কারণেই আমার পক্ষে কার্যকর হয়নি, যদিও এটি দুর্দান্ত দেখাচ্ছে। আমি যদিও এটি বিকল্প হিসাবে কাজ করতে পেলাম: সন্ধান করুন। -এক্সেক / বিন / বাশ-সি 'এমভি {} `ট্র [এজেড] [এজে] <<< {}`' \;
জন রিক্স

এটি এর prenameথেকে প্রয়োজন perl: dpkg -S "$(readlink -e /usr/bin/rename)"দেয়perl: /usr/bin/prename
টিনো

4

বহিরাগত প্রোগ্রামগুলি ব্যবহার করে অনেক উত্তর, যা সত্যই ব্যবহার হচ্ছে না Bash

যদি আপনি জানেন যে আপনার কাছে বাশ 4 উপলব্ধ থাকবে আপনার সত্যিকারের কেবল ${VAR,,}স্বরলিপিটি ব্যবহার করা উচিত (এটি সহজ এবং দুর্দান্ত)। 4 এর আগে বাশের জন্য (উদাহরণস্বরূপ আমার ম্যাক এখনও বাশ 3.2 ব্যবহার করে)। আমি আরও পোর্টেবল সংস্করণ তৈরি করতে @ ঘোস্টডোগ 74 এর উত্তরের সংশোধিত সংস্করণটি ব্যবহার করেছি।

আপনি কল করতে পারেন lowercase 'my STRING'এবং একটি ছোট হাতের সংস্করণ পাবেন। আমি ফলাফলটি কোনও ভারে সেট করার বিষয়ে মন্তব্য পড়েছি, তবে এটি সত্যিই পোর্টেবল নয় Bash, যেহেতু আমরা স্ট্রিংগুলি ফিরিয়ে দিতে পারি না। এটি মুদ্রণ সবচেয়ে ভাল সমাধান। মত কিছু সঙ্গে ক্যাপচার সহজ var="$(lowercase $str)"

এটি কীভাবে কাজ করে

এটি যেভাবে কাজ করে তা হ'ল প্রতিটি চরের সাথে ASCII পূর্ণসংখ্যার প্রতিনিধিত্ব পাওয়া printfএবং তারপরে adding 32যদি upper-to->lower, বা subtracting 32যদি lower-to->upper। তারপরে printfনম্বরটি আবার চরে রূপান্তর করতে আবার ব্যবহার করুন । আমাদের থেকে 'A' -to-> 'a'32 টি অক্ষরের পার্থক্য রয়েছে।

printfব্যাখ্যার জন্য ব্যবহার :

$ printf "%d\n" "'a"
97
$ printf "%d\n" "'A"
65

97 - 65 = 32

এবং এটি উদাহরণ সহ কার্যকারী সংস্করণ।
কোডটিতে মন্তব্যগুলি নোট করুন, কারণ তারা প্রচুর স্টাফ ব্যাখ্যা করে:

#!/bin/bash

# lowerupper.sh

# Prints the lowercase version of a char
lowercaseChar(){
    case "$1" in
        [A-Z])
            n=$(printf "%d" "'$1")
            n=$((n+32))
            printf \\$(printf "%o" "$n")
            ;;
        *)
            printf "%s" "$1"
            ;;
    esac
}

# Prints the lowercase version of a sequence of strings
lowercase() {
    word="$@"
    for((i=0;i<${#word};i++)); do
        ch="${word:$i:1}"
        lowercaseChar "$ch"
    done
}

# Prints the uppercase version of a char
uppercaseChar(){
    case "$1" in
        [a-z])
            n=$(printf "%d" "'$1")
            n=$((n-32))
            printf \\$(printf "%o" "$n")
            ;;
        *)
            printf "%s" "$1"
            ;;
    esac
}

# Prints the uppercase version of a sequence of strings
uppercase() {
    word="$@"
    for((i=0;i<${#word};i++)); do
        ch="${word:$i:1}"
        uppercaseChar "$ch"
    done
}

# The functions will not add a new line, so use echo or
# append it if you want a new line after printing

# Printing stuff directly
lowercase "I AM the Walrus!"$'\n'
uppercase "I AM the Walrus!"$'\n'

echo "----------"

# Printing a var
str="A StRing WITH mixed sTUFF!"
lowercase "$str"$'\n'
uppercase "$str"$'\n'

echo "----------"

# Not quoting the var should also work, 
# since we use "$@" inside the functions
lowercase $str$'\n'
uppercase $str$'\n'

echo "----------"

# Assigning to a var
myLowerVar="$(lowercase $str)"
myUpperVar="$(uppercase $str)"
echo "myLowerVar: $myLowerVar"
echo "myUpperVar: $myUpperVar"

echo "----------"

# You can even do stuff like
if [[ 'option 2' = "$(lowercase 'OPTION 2')" ]]; then
    echo "Fine! All the same!"
else
    echo "Ops! Not the same!"
fi

exit 0

এবং এটি চালানোর পরে ফলাফল:

$ ./lowerupper.sh 
i am the walrus!
I AM THE WALRUS!
----------
a string with mixed stuff!
A STRING WITH MIXED STUFF!
----------
a string with mixed stuff!
A STRING WITH MIXED STUFF!
----------
myLowerVar: a string with mixed stuff!
myUpperVar: A STRING WITH MIXED STUFF!
----------
Fine! All the same!

এটি কেবল ASCII অক্ষরের জন্য কাজ করা উচিত

আমার জন্য এটি ঠিক আছে, যেহেতু আমি জানি আমি এটিতে কেবল ASCII অক্ষরগুলিই পাস করব।
আমি এটি কিছু কেস-সংবেদনশীল সিএলআই বিকল্পগুলির জন্য ব্যবহার করছি, উদাহরণস্বরূপ।


4

রূপান্তরকারী কেসটি কেবলমাত্র বর্ণমালার জন্য করা হয়। সুতরাং, এটি পরিষ্কারভাবে কাজ করা উচিত।

আমি উচ্চ বর্ণের থেকে নিম্নের ক্ষেত্রে অ্যাজ-এর মধ্যে বর্ণমালা রূপান্তর করার দিকে মনোনিবেশ করছি। অন্য যে কোনও অক্ষর যেমন স্ট্যান্ডআউটে প্রিন্ট করা উচিত ...

পাথের সমস্ত পাঠ্যকে এজেডের মধ্যে পরিসীমা / এ / ফাইল / ফাইলনামকে এজেডে রূপান্তর করে

লোয়ার কেস কে আপার কেস রূপান্তর করার জন্য

cat path/to/file/filename | tr 'a-z' 'A-Z'

আপার কেস থেকে লোয়ার কেসে রূপান্তর করার জন্য

cat path/to/file/filename | tr 'A-Z' 'a-z'

উদাহরণ স্বরূপ,

ফাইলের নাম:

my name is xyz

রূপান্তরিত হয়:

MY NAME IS XYZ

উদাহরণ 2:

echo "my name is 123 karthik" | tr 'a-z' 'A-Z'
# Output:
# MY NAME IS 123 KARTHIK

উদাহরণ 3:

echo "my name is 123 &&^&& #@$#@%%& kAR2~thik" | tr 'a-z' 'A-Z'
# Output:
# MY NAME IS 123 &&^&& #@0@%%& KAR2~THIK

3

যদি ভি 4 ব্যবহার করে থাকে তবে এটি বেকড হয় । যদি তা না হয় তবে এখানে একটি সহজ, ব্যাপকভাবে প্রয়োগযোগ্য সমাধান। এই থ্রেডের অন্যান্য উত্তর (এবং মন্তব্যগুলি) নীচের কোডটি তৈরি করতে বেশ সহায়ক ছিল।

# Like echo, but converts to lowercase
echolcase () {
    tr [:upper:] [:lower:] <<< "${*}"
}

# Takes one arg by reference (var name) and makes it lowercase
lcase () { 
    eval "${1}"=\'$(echo ${!1//\'/"'\''"} | tr [:upper:] [:lower:] )\'
}

মন্তব্য:

  • করছেন: a="Hi All"এবং তারপরে: lcase aএকই জিনিসটি করবে:a=$( echolcase "Hi All" )
  • লাস ফাংশনে, ${!1//\'/"'\''"}পরিবর্তে ব্যবহার ${!1}করে স্ট্রিংয়ের উদ্ধৃতি থাকলেও এটি কাজ করতে দেয়।

3

4.0 এর আগের বাশ সংস্করণগুলির জন্য, এই সংস্করণটি দ্রুত হওয়া উচিত (কারণ এটি কোনও আদেশকে কাঁটাচামচ করে / চালায় না ):

function string.monolithic.tolower
{
   local __word=$1
   local __len=${#__word}
   local __char
   local __octal
   local __decimal
   local __result

   for (( i=0; i<__len; i++ ))
   do
      __char=${__word:$i:1}
      case "$__char" in
         [A-Z] )
            printf -v __decimal '%d' "'$__char"
            printf -v __octal '%03o' $(( $__decimal ^ 0x20 ))
            printf -v __char \\$__octal
            ;;
      esac
      __result+="$__char"
   done
   REPLY="$__result"
}

টেকনোসরাস এর উত্তরটির সম্ভাবনাও ছিল, যদিও এটি আমার জন্য সঠিকভাবে চালিত হয়নি।


খারাপ না! এই পদ্ধতির কর্মক্ষমতা বিশ্লেষণের জন্য, দয়া করে মেট্রিকগুলির জন্য আমার উত্তরটি দেখুন।
দেজে ক্লেটন

3

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

  1. জিএনইউ বাশ, সংস্করণ ৪.১.২ (১) -আর দয়া করে (x86_64-redhat-linux-gnu)
  2. জিএনইউ বাশ, সংস্করণ ৩.২.৫ 1 (১) রিলিজ (স্পার্ক-সান-সোলারিস ২.১০)
lcs="abcdefghijklmnopqrstuvwxyz"
ucs="ABCDEFGHIJKLMNOPQRSTUVWXYZ"
input="Change Me To All Capitals"
for (( i=0; i<"${#input}"; i++ )) ; do :
    for (( j=0; j<"${#lcs}"; j++ )) ; do :
        if [[ "${input:$i:1}" == "${lcs:$j:1}" ]] ; then
            input="${input/${input:$i:1}/${ucs:$j:1}}" 
        fi
    done
done

স্ট্রিংগুলির মাধ্যমে লুপের জন্য সরল সি স্টাইল । নীচের লাইনের জন্য যদি আপনি এর আগে এমন কিছু না দেখে থাকেন তবে আমি এটি কোথায় শিখলাম । এই ক্ষেত্রে লাইনটি চেক $ {ইনপুট: $ i: 1} (লোয়ার কেস) ইনপুটটিতে উপস্থিত রয়েছে এবং এটি যদি প্রদত্ত চর $ {ucs: $ j: 1} (আপার কেস) এর সাথে প্রতিস্থাপন করে এবং এটি সঞ্চয় করে তা পরীক্ষা করে ইনপুট ফিরে।

input="${input/${input:$i:1}/${ucs:$j:1}}"

এটি বন্যভাবে অদক্ষ, উপরে আপনার উদাহরণে 650 বার লুপ করে এবং আমার মেশিনে 1000 টি অনুরোধ সম্পাদন করতে 35 সেকেন্ড সময় নেয়। এমন একটি বিকল্পের জন্য যা 1000 টি আমন্ত্রণ সম্পাদন করতে মাত্র 11 বার লুপ করে এবং 5 সেকেন্ডেরও কম সময় নেয়, আমার বিকল্প উত্তরটি দেখুন।
দেজে ক্লেটন

1
ধন্যবাদ, যদিও এটি কেবল তাকানো থেকেই এটি সুস্পষ্ট হওয়া উচিত। সম্ভবত পৃষ্ঠা ত্রুটিগুলি ইনপুট আকার এবং আপনি সম্পাদন করছেন এমন পুনরাবৃত্তির সংখ্যা থেকে। তবুও আমি আপনার সমাধানটি পছন্দ করি।
জেয়ার্ডটিএস 486

3

এটি জ্যারেডএসটিএস 486 এর পদ্ধতির একটি আরও দ্রুত প্রকরণ যা তার পদ্ধতির অনুকূলকরণের জন্য নেটিভ বাশ ক্ষমতা (বাশ সংস্করণ <4.0 সহ) ব্যবহার করে।

ছোট স্ট্রিং (25 টি অক্ষর) এবং বৃহত্তর স্ট্রিং (445 অক্ষর) এর জন্য ছোট ছোট স্ট্রিং এবং বড় হাতের রূপান্তর উভয়ের জন্য আমি এই পদ্ধতির 1,000 পুনরাবৃত্তিগুলি টাইম করেছি। যেহেতু পরীক্ষার স্ট্রিংগুলি মূলত ছোট হাতের হয় তাই ছোট হাতের কাছে রূপান্তরগুলি বড়হাতের চেয়ে সাধারণত দ্রুত হয়।

আমি আমার পদ্ধতির তুলনা করেছি এই পৃষ্ঠায় থাকা আরও কয়েকটি উত্তরের সাথে যা বাশ 3.2 এর সাথে সামঞ্জস্যপূর্ণ। আমার দৃষ্টিভঙ্গি এখানে ডকুমেন্টেড বেশিরভাগ পদ্ধতির চেয়ে অনেক বেশি পারফরম্যান্স trএবং বেশ কয়েকটি ক্ষেত্রে এর চেয়েও দ্রুত ।

25 টি অক্ষরের 1,000 পুনরাবৃত্তির জন্য এখানে সময় ফলাফল রয়েছে:

  • ছোট হাতের দিকে আমার দৃষ্টিভঙ্গির জন্য 0.46 এস; বড় হাতের জন্য 0.96 এস
  • অরওলোফিলের ছোট হাতের কাছে যাওয়ার জন্য 1.16s ; 1.59s বড় হাতের জন্য
  • trছোট হাতের জন্য 3.67s ; বড় হাতের জন্য 3.81 এস
  • লোস্টকেসে ঘোস্টডোগ 74 এর পদ্ধতির জন্য 11.12 এস ; বড় হাতের জন্য 31.41 এস
  • টেকনোসরাসকে ছোট হাতের কাছে নিয়ে যাওয়ার জন্য 26.25 এস ; বড় হাতের জন্য 26.21 এস
  • লোয়ারকেসে জ্যারেডটিএস 486 এর পদ্ধতির জন্য 25.06 এস ; বড় হাতের জন্য 27.04 এস

৪৪৫ টি চরিত্রের ১,০০০ পুনরাবৃত্তির জন্য সময়সীমার ফলাফল (উইটার ব্যানার এর "দ্য রবিন" কবিতাটি নিয়ে গঠিত):

  • ছোট হাতের দিকে আমার দৃষ্টিভঙ্গির জন্য 2 এস; বড় হাতের জন্য 12s
  • trছোট হাতের জন্য 4 এস ; বড় হাতের জন্য 4 এস
  • অরওলোফিলের ছোট হাতের কাছে যাওয়ার জন্য 20s ; বড় হাতের জন্য 29s
  • লোস্টকেসে ঘোস্টডোগ 74 এর পদ্ধতির জন্য 75s ; বড় হাতের জন্য 669s। প্রধান আকর্ষণীয় ম্যাচগুলির সাথে একটি টেস্টের মধ্যে পারফরম্যান্সের পারফরম্যান্সের পার্থক্য কতটা নাটকীয় তা লক্ষ্য করা আকর্ষণীয় pred
  • ছোট হাতের কাছে টেকনোসরাস এর পদ্ধতির জন্য 467s ; বড় হাতের জন্য 449s
  • জয়ার্ডটিএস 486 এর ছোট হাতের কাছে যাওয়ার জন্য 660s ; বড় হাতের জন্য 660s। এটি আকর্ষণীয় যে এই পদ্ধতিতে বাশে অবিচ্ছিন্ন পৃষ্ঠা ত্রুটিগুলি (মেমরি অদলবদল) উত্পন্ন হয়েছিল

সমাধান:

#!/bin/bash
set -e
set -u

declare LCS="abcdefghijklmnopqrstuvwxyz"
declare UCS="ABCDEFGHIJKLMNOPQRSTUVWXYZ"

function lcase()
{
  local TARGET="${1-}"
  local UCHAR=''
  local UOFFSET=''

  while [[ "${TARGET}" =~ ([A-Z]) ]]
  do
    UCHAR="${BASH_REMATCH[1]}"
    UOFFSET="${UCS%%${UCHAR}*}"
    TARGET="${TARGET//${UCHAR}/${LCS:${#UOFFSET}:1}}"
  done

  echo -n "${TARGET}"
}

function ucase()
{
  local TARGET="${1-}"
  local LCHAR=''
  local LOFFSET=''

  while [[ "${TARGET}" =~ ([a-z]) ]]
  do
    LCHAR="${BASH_REMATCH[1]}"
    LOFFSET="${LCS%%${LCHAR}*}"
    TARGET="${TARGET//${LCHAR}/${UCS:${#LOFFSET}:1}}"
  done

  echo -n "${TARGET}"
}

পদ্ধতিরটি সহজ: ইনপুট স্ট্রিংটিতে কোনও অবশিষ্ট বড় অক্ষর উপস্থিত থাকলেও পরবর্তী একটিটি সন্ধান করুন এবং সেই চিঠির সমস্ত দৃষ্টান্ত তার ছোট হাতের অক্ষরের সাথে প্রতিস্থাপন করুন। সমস্ত বড় হাতের অক্ষর প্রতিস্থাপন না করা পর্যন্ত পুনরাবৃত্তি করুন।

আমার সমাধানের কিছু কার্যকারিতা বৈশিষ্ট্য:

  1. কেবল শেল বিল্টিন ইউটিলিটিগুলি ব্যবহার করে, যা একটি নতুন প্রক্রিয়াতে বাহ্যিক বাইনারি ইউটিলিটিগুলি চালিত করার ওভারহেডকে এড়িয়ে চলে
  2. সাব-শেলগুলি এড়িয়ে চলে, এতে পারফরম্যান্সের জরিমানা হয়
  3. পারফরম্যান্সের জন্য সংকলিত ও অনুকূলিতকরণ করা শেল প্রক্রিয়াগুলি ব্যবহার করে যেমন ভেরিয়েবলের মধ্যে গ্লোবাল স্ট্রিং প্রতিস্থাপন, ভেরিয়েবল প্রত্যয় ছাঁটাই এবং রিজেক্স অনুসন্ধান এবং মিল matching এই প্রক্রিয়াগুলি স্ট্রিংগুলির মাধ্যমে ম্যানুয়ালি পুনরাবৃত্তি করার চেয়ে অনেক দ্রুত
  4. রূপান্তর করতে অনন্য মিলে যাওয়া চরিত্রের গণনা দ্বারা প্রয়োজনীয় সময়ের সংখ্যাটি লুপ করে। উদাহরণস্বরূপ, তিনটি পৃথক বড় হাতের অক্ষরযুক্ত ছোট ছোট স্ট্রিংকে রূপান্তর করতে কেবল 3 টি লুপ পুনরাবৃত্তি প্রয়োজন। পূর্বনির্ধারিত এএসসিআইআই বর্ণমালার জন্য লুপ পুনরাবৃত্তির সর্বাধিক সংখ্যা 26 হয় is
  5. UCSএবং LCSঅতিরিক্ত অক্ষরের সাথে বাড়ানো যেতে পারে

2

রূপান্তরিত স্ট্রিংটি একটি ভেরিয়েবলে সঞ্চয় করতে। নিম্নলিখিত আমার জন্য কাজ - $SOURCE_NAMEথেকে$TARGET_NAME

TARGET_NAME="`echo $SOURCE_NAME | tr '[:upper:]' '[:lower:]'`"

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.