উত্তর:
echo "syslog_apr_24_30" |
awk -F'_' '{print $1"_"toupper(substr($2,1,1)) substr($2,2) "_"$3"_"$4}'
Awk
সাবস্ট্রিংস এবং টুপার সহ সংস্করণ
awk 'BEGIN{ FS=OFS="_"} {
cap=toupper(substr($2,1,1));
lower=substr($2,2,3);
$2 = cap lower; print
}' list.txt
নমুনা রান:
$ awk 'BEGIN{ FS=OFS="_"} {
cap=toupper(substr($2,1,1));
lower=substr($2,2,3);$2 = cap lower; print
}' list.txt
syslog_Apr_24_30
syslog_Mar_01_17
ব্যবহার awk
:
awk -F_ '{
printf "%s_%s_%s_%s",$1,toupper(substr($2,1,1))substr($2,2,2),$3,$4"\n"
}' foo
অথবা
awk -F_ '{
for(i=1;i<=NF;i++) {
if(i==2){
printf "%s",toupper(substr($i,1,1))substr($i,2,length($i)-1)
}
else {printf "%s",$i}
if(i<NF) {printf "%s","_"}
} printf "%s","\n"}' foo
উদাহরণ
% cat foo
syslog_apr_24_30
syslog_mar_01_17
% awk -F_ '{for(i=1;i<=NF;i++) {if(i==2){printf "%s",toupper(substr($i,1,1))substr($i,2,length($i)-1)} else {printf "%s",$i} if(i<NF) {printf "%s","_"}} printf "%s","\n"}' foo
syslog_Apr_24_30
syslog_Mar_01_17
% awk -F_ '{printf "%s_%s_%s_%s",$1,toupper(substr($2,1,1))substr($2,2,2),$3,$4"\n"}' foo
syslog_Apr_24_30
syslog_Mar_01_17
এখানে একটি পার্ল পদ্ধতির:
$ perl -pe 's/_./uc($&)/e' file
syslog_Apr_24_30
syslog_Mar_01_17
-p
স্ক্রিপ্ট দেওয়া প্রয়োগের পরে মুদ্রিত প্রতিটি লাইন ঘটায় -e
। প্রতিস্থাপনের প্রথম উদাহরণটি প্রতিস্থাপন করে _
এবং চরিত্রটি নিজের সাথে এটি অনুসরণ করে ( $&
যা কিছু মিলিত হয়েছিল) আপার কেসড ( uc()
), এক্সপ্রেশনটি e
অপারেটরের শেষে ( s///e
) এর এক্সপ্রেশন মূল্যায়নের জন্য প্রয়োজন।
খাঁটি বাশ ৪.x, আপনি যে অংশটি উপগ্রহ করতে চান তা বেছে নিতে একটি রেজেেক্স এবং সেই ^^
অংশের আপকেস অপারেটর ব্যবহার করুন। পুরো স্ট্রিংটি পুনরায় তৈরি করতে সামনে এবং পিছনে টিচার (এটি মিলেছে * *):
foo=syslog_apr_24_30
if [[ $foo =~ (.*)(_[a-z])(.*) ]]; then
foo=${BASH_REMATCH[1]}${BASH_REMATCH[2]^^}${BASH_REMATCH[3]}
fi
যদি আপনি সমস্ত উদ্ধৃতি বিধিগুলি মনে না রাখেন তবে রেজেক্স (যা =~
একটি আক্ষরিক স্ট্রিং-ম্যাচ করে তোলে ) ব্যতীত সমস্ত কিছু উদ্ধৃত করা নিরাপদ ।
^
Upcase প্রথম অপারেটর শুধুমাত্র একটি পরিবর্তনশীল (অথবা অ্যারের উপাদান) শুরুতে কাজ করে। এবং এমন কোনও স্ট্রাস্টিং সম্প্রসারণ বলে মনে হচ্ছে না যা আপনাকে জানায় যে কী পার্ল একটি ল্যাভালু কল করবে (যা আপনি নির্ধারণ / সংশোধন করতে পারেন)। আপ / ডাউনসেস-ফার্স্ট অপারেটররা প্রতি-চরিত্রের ভিত্তিতে মেলে এমন একটি প্যাটার্ন নিতে পারে, তবে এটি এড়িয়ে যেতে সহায়তা করে না syslog_
, কারণ এমন মাসের নাম রয়েছে যা "সিসলগ" -র অক্ষর দিয়ে শুরু হয়।
যাইহোক, এটি foo="$(echo "$foo" | sed 's/_./\U&/')"
গ্লেন জ্যাকম্যানের দ্বারা গৃহীত উত্তরের একটি মন্তব্য হিসাবে পোস্ট করা চেয়ে দ্রুত হতে পারে ।
পার্সের তুলনায় বাশ, সেড বা অ্যাজক অনেক গুণ বেশি দ্রুত হবে। যদি আপনি শেল স্ক্রিপ্টে দরকারী একাধিক পার্ল ওয়ান-লাইনারগুলি সন্ধান করতে শুরু করেন তবে আপনার কেবল পুরো জিনিসটি পার্লে লেখা উচিত।
যদি মাসটি সর্বদা প্রথম "_" (আন্ডারস্কোর) অনুসরণ করে তবে এটি ব্যবহার করুন (অন্যান্য উত্তরে দেখানো হয়েছে):
sed -e 's/_\(.\)/_\u\1/'
যদি মাসের আগেরটির আগে অন্য আন্ডারস্কোর থাকতে পারে তবে উপরেরগুলি কাজ করবে না।
যদি মাসটি সর্বদা 8 তম অক্ষর দিয়ে শুরু হয় তবে এটি ব্যবহার করুন:
sed -e 's/^\(.\{7\}\)\(.\)/\1\u\2/'
sed 's/_./\U&/'