ভিতরে কোন উপায় আছে? সজোরে আঘাত একটি স্ট্রিংকে লোয়ার কেস স্ট্রিংয়ে রূপান্তর করতে?
উদাহরণস্বরূপ, যদি আমার কাছে থাকে:
a="Hi all"
আমি এটিকে রূপান্তর করতে চাই:
"hi all"
ভিতরে কোন উপায় আছে? সজোরে আঘাত একটি স্ট্রিংকে লোয়ার কেস স্ট্রিংয়ে রূপান্তর করতে?
উদাহরণস্বরূপ, যদি আমার কাছে থাকে:
a="Hi all"
আমি এটিকে রূপান্তর করতে চাই:
"hi all"
উত্তর:
বিভিন্ন উপায়:
$ echo "$a" | tr '[:upper:]' '[:lower:]'
hi all
$ echo "$a" | awk '{print tolower($0)}'
hi all
আপনি নিম্নলিখিত উদাহরণগুলির সাথে বহনযোগ্যতার সমস্যাগুলিতে চলে যেতে পারেন:
$ echo "${a,,}"
hi all
$ 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] এর সাথে ভুলভাবে মিলেছে। ডাবল নেগেটিভ ("আনসেটিং নোকাসেম্যাচ") দ্বারা বাশ বিভ্রান্ত! :-)
word="Hi All"
অন্যান্য উদাহরণ মত, এটা ফেরৎ ha
না hi all
। এটি কেবলমাত্র মূলধর্মী অক্ষরের জন্য কাজ করে এবং ইতিমধ্যে নিম্ন-বর্ণিত অক্ষরগুলি এড়িয়ে যায়।
tr
এবং awk
উদাহরণগুলি পসিক্স স্ট্যান্ডার্ডে নির্দিষ্ট করা আছে।
tr '[:upper:]' '[:lower:]'
বড় হাতের অক্ষর / ছোট হাতের সমতুল্য নির্ধারণের জন্য বর্তমান লোকেল ব্যবহার করবে, সুতরাং এটি লোকালগুলির সাথে কাজ করবে যা ডায়াক্রিটিকাল চিহ্ন সহ অক্ষর ব্যবহার করে।
b="$(echo $a | tr '[A-Z]' '[a-z]')"
বাশ 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 ।
সম্পাদনা করুন: বাশ ৪.৩-এর সাথে মেলে টিলডের আচরণটি সংশোধন করা হয়েছে।
string="łódź"; echo ${string~~}
"ŁÓDŁÓ" ফিরে আসবে, তবে echo ${string^^}
"źDłó" প্রদান করবে। এমনকি ভিতরে LC_ALL=pl_PL.utf-8
। এটি ব্যাশ 4.2.24 ব্যবহার করছে।
en_US.UTF-8
। এটি একটি বাগ এবং আমি এটি রিপোর্ট করেছি।
echo "$string" | tr '[:lower:]' '[:upper:]'
। এটি সম্ভবত একই ব্যর্থতা প্রদর্শন করবে। সুতরাং সমস্যাটি কমপক্ষে আংশিকভাবে বাশের নয়।
echo "Hi All" | tr "[:upper:]" "[:lower:]"
tr
জন্য আমার পক্ষে কাজ করে না। আমার কাছে সঠিক লোকেল সেট এবং লোকেল ফাইল উত্পন্ন হয়েছে। আমি কি ভুল হতে পারে কোন ধারণা আছে?
[:upper:]
দরকার?
a="$(tr [A-Z] [a-z] <<< "$a")"
{ print tolower($0) }
y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
a="$(tr [A-Z] [a-z] <<< "$a")"
আমার কাছে সবচেয়ে সহজ দেখাচ্ছে। আমি এখনও একটি শিক্ষানবিস ...
sed
সমাধানের সুপারিশ করছি ; আমি এমন একটি পরিবেশে কাজ করে যাচ্ছি যে কোনও কারণে নেই tr
তবে আমি এখনও ছাড়া একটি সিস্টেম খুঁজে পেয়েছি sed
, আরও অনেক সময় আমি এটি করতে চাই আমি কেবল অন্যভাবে কিছু করেছি sed
তাই চেইন করতে পারি কমান্ডগুলি একক (দীর্ঘ) বিবৃতিতে একত্রিত হয়।
tr [A-Z] [a-z] A
, শেল ফাইলের নাম প্রসারণ সম্পাদন করতে পারে যদি কোনও অক্ষর বা নলবব সমন্বিত ফাইলের নাম থাকে । tr "[A-Z]" "[a-z]" A
সঠিকভাবে আচরণ করবে।
sed
tr [A-Z] [a-z]
প্রায় সব লোকেলের মধ্যেই ভুল। উদাহরণস্বরূপ, en-US
লোকালয়ে, A-Z
আসলে অন্তর অন্তর AaBbCcDdEeFfGgHh...XxYyZ
।
আমি জানি এটি একটি পুরানো পোস্ট তবে আমি এই উত্তরটি অন্য সাইটের জন্য তৈরি করেছিলাম তাই আমি ভেবেছিলাম এটি এখানে পোস্ট করব:
আপের -> নিম্ন : পাইথন ব্যবহার করুন:
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
উপরের ক্ষেত্রে।
a
একটি একক উক্তি থাকে তবে আপনার কেবল আচরণই ভাঙ্গা হয়নি, তবে একটি গুরুতর সুরক্ষা সমস্যা।
জেডএসে:
echo $a:u
ভালোবাসি জেএসএস!
echo ${(C)a} #Upcase the first char only
প্রাক বাশ 4.0
একটি স্ট্রিংয়ের কেসটি লোয়ার করুন এবং ভেরিয়েবলের জন্য বরাদ্দ করুন
VARIABLE=$(echo "$VARIABLE" | tr '[:upper:]' '[:lower:]')
echo "$VARIABLE"
echo
পাইপগুলির প্রয়োজন নেই : ব্যবহার করুন$(tr '[:upper:]' '[:lower:]' <<<"$VARIABLE")
শুধুমাত্র বিল্টিনগুলি ব্যবহার করে একটি স্ট্যান্ডার্ড শেল (বাশিজম ছাড়াই) জন্য:
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}"
}
${var:1:1}
হ'ল বাশীবাদ।
আমি যে আদেশটি ভাগ করতে চাইছি তার কৃতিত্ব নিতে চাই তবে সত্যটি আমি এটি 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
বহিরাগত প্রোগ্রামগুলি ব্যবহার করে অনেক উত্তর, যা সত্যই ব্যবহার হচ্ছে না 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 অক্ষরগুলিই পাস করব।
আমি এটি কিছু কেস-সংবেদনশীল সিএলআই বিকল্পগুলির জন্য ব্যবহার করছি, উদাহরণস্বরূপ।
রূপান্তরকারী কেসটি কেবলমাত্র বর্ণমালার জন্য করা হয়। সুতরাং, এটি পরিষ্কারভাবে কাজ করা উচিত।
আমি উচ্চ বর্ণের থেকে নিম্নের ক্ষেত্রে অ্যাজ-এর মধ্যে বর্ণমালা রূপান্তর করার দিকে মনোনিবেশ করছি। অন্য যে কোনও অক্ষর যেমন স্ট্যান্ডআউটে প্রিন্ট করা উচিত ...
পাথের সমস্ত পাঠ্যকে এজেডের মধ্যে পরিসীমা / এ / ফাইল / ফাইলনামকে এজেডে রূপান্তর করে
লোয়ার কেস কে আপার কেস রূপান্তর করার জন্য
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
যদি ভি 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}
করে স্ট্রিংয়ের উদ্ধৃতি থাকলেও এটি কাজ করতে দেয়।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"
}
টেকনোসরাস এর উত্তরটির সম্ভাবনাও ছিল, যদিও এটি আমার জন্য সঠিকভাবে চালিত হয়নি।
এই প্রশ্নটি কত পুরানো সত্ত্বেও টেকনোসরাস দ্বারা এই উত্তরটির সাথে মিল রয়েছে । বেশিরভাগ প্ল্যাটফর্মগুলিতে (যা আমি ব্যবহার করি) পাশাপাশি ব্যাশের পুরানো সংস্করণগুলিতে পোর্টেবল একটি সমাধান খুঁজে পেতে আমার বেশ কষ্ট হয়েছিল। আমি তুচ্ছ ভেরিয়েবলগুলি পুনরুদ্ধার করতে অ্যারে, ফাংশন এবং প্রিন্ট, ইকোস এবং অস্থায়ী ফাইলগুলির ব্যবহার নিয়ে হতাশও হয়েছি। এটি এখন পর্যন্ত আমার পক্ষে খুব ভাল কাজ করেছে আমি ভেবেছিলাম ভাগ করে নেব। আমার প্রধান পরীক্ষার পরিবেশগুলি হ'ল:
- জিএনইউ বাশ, সংস্করণ ৪.১.২ (১) -আর দয়া করে (x86_64-redhat-linux-gnu)
- জিএনইউ বাশ, সংস্করণ ৩.২.৫ 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}}"
এটি জ্যারেডএসটিএস 486 এর পদ্ধতির একটি আরও দ্রুত প্রকরণ যা তার পদ্ধতির অনুকূলকরণের জন্য নেটিভ বাশ ক্ষমতা (বাশ সংস্করণ <4.0 সহ) ব্যবহার করে।
ছোট স্ট্রিং (25 টি অক্ষর) এবং বৃহত্তর স্ট্রিং (445 অক্ষর) এর জন্য ছোট ছোট স্ট্রিং এবং বড় হাতের রূপান্তর উভয়ের জন্য আমি এই পদ্ধতির 1,000 পুনরাবৃত্তিগুলি টাইম করেছি। যেহেতু পরীক্ষার স্ট্রিংগুলি মূলত ছোট হাতের হয় তাই ছোট হাতের কাছে রূপান্তরগুলি বড়হাতের চেয়ে সাধারণত দ্রুত হয়।
আমি আমার পদ্ধতির তুলনা করেছি এই পৃষ্ঠায় থাকা আরও কয়েকটি উত্তরের সাথে যা বাশ 3.2 এর সাথে সামঞ্জস্যপূর্ণ। আমার দৃষ্টিভঙ্গি এখানে ডকুমেন্টেড বেশিরভাগ পদ্ধতির চেয়ে অনেক বেশি পারফরম্যান্স tr
এবং বেশ কয়েকটি ক্ষেত্রে এর চেয়েও দ্রুত ।
25 টি অক্ষরের 1,000 পুনরাবৃত্তির জন্য এখানে সময় ফলাফল রয়েছে:
tr
ছোট হাতের জন্য 3.67s ; বড় হাতের জন্য 3.81 এস৪৪৫ টি চরিত্রের ১,০০০ পুনরাবৃত্তির জন্য সময়সীমার ফলাফল (উইটার ব্যানার এর "দ্য রবিন" কবিতাটি নিয়ে গঠিত):
tr
ছোট হাতের জন্য 4 এস ; বড় হাতের জন্য 4 এসসমাধান:
#!/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}"
}
পদ্ধতিরটি সহজ: ইনপুট স্ট্রিংটিতে কোনও অবশিষ্ট বড় অক্ষর উপস্থিত থাকলেও পরবর্তী একটিটি সন্ধান করুন এবং সেই চিঠির সমস্ত দৃষ্টান্ত তার ছোট হাতের অক্ষরের সাথে প্রতিস্থাপন করুন। সমস্ত বড় হাতের অক্ষর প্রতিস্থাপন না করা পর্যন্ত পুনরাবৃত্তি করুন।
আমার সমাধানের কিছু কার্যকারিতা বৈশিষ্ট্য:
UCS
এবং LCS
অতিরিক্ত অক্ষরের সাথে বাড়ানো যেতে পারে