স্ট্রিংয়ে কেবল মাত্র একটি অক্ষর ছোট বা বড় হাতের অক্ষরে অবধি বা সেড?


13

কিছু স্ট্রিংয়ে কেবল একটি অক্ষর বড় হাতের অক্ষর / ছোট হাতের কীভাবে আছে?

ইনপুট উদাহরণ:

syslog_apr_24_30
syslog_mar_01_17

পছন্দসই আউটপুট:

syslog_Apr_24_30
syslog_Mar_01_17

নোট দয়া করে মাসের বড় হাতের শুরু।

আমি চেষ্টা করেছি awkকিন্তু আমি এটির কাজ করার পক্ষে যথেষ্ট ভাল নই।

উত্তর:


18

আপনি \uএকটি চিঠি বড়হাতে GNU সেডে ব্যবহার করতে পারেন :

sed -e 's/_\(.\)/_\u\1/' input

পার্ল একই কাজ করে:

perl -pe 's/_(.)/_\u$1/' input

\l বিপরীত না।


8
একটি স্পর্শ সহজ:sed 's/_./\U&/'
গ্লেন জ্যাকম্যান


3

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

3

ব্যবহার 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

3

এখানে একটি পার্ল পদ্ধতির:

$ perl -pe 's/_./uc($&)/e' file
syslog_Apr_24_30
syslog_Mar_01_17

-pস্ক্রিপ্ট দেওয়া প্রয়োগের পরে মুদ্রিত প্রতিটি লাইন ঘটায় -e। প্রতিস্থাপনের প্রথম উদাহরণটি প্রতিস্থাপন করে _এবং চরিত্রটি নিজের সাথে এটি অনুসরণ করে ( $&যা কিছু মিলিত হয়েছিল) আপার কেসড ( uc()), এক্সপ্রেশনটি eঅপারেটরের শেষে ( s///e) এর এক্সপ্রেশন মূল্যায়নের জন্য প্রয়োজন।



1

খাঁটি বাশ ৪.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&/')"গ্লেন জ্যাকম্যানের দ্বারা গৃহীত উত্তরের একটি মন্তব্য হিসাবে পোস্ট করা চেয়ে দ্রুত হতে পারে ।

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


0

যদি মাসটি সর্বদা প্রথম "_" (আন্ডারস্কোর) অনুসরণ করে তবে এটি ব্যবহার করুন (অন্যান্য উত্তরে দেখানো হয়েছে):

sed -e 's/_\(.\)/_\u\1/'

যদি মাসের আগেরটির আগে অন্য আন্ডারস্কোর থাকতে পারে তবে উপরেরগুলি কাজ করবে না।

যদি মাসটি সর্বদা 8 তম অক্ষর দিয়ে শুরু হয় তবে এটি ব্যবহার করুন:

sed -e 's/^\(.\{7\}\)\(.\)/\1\u\2/'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.