সেড - প্রতি 3 য় শব্দকে কীভাবে মূলধন করা যায়?


9

প্রদত্ত:

main_east_library
main_west_roof
main_north_roof
minor_south_roof

আমি কিভাবে ব্যবহার করতে পারেন sed(বিশেষত না awk, trইত্যাদি) তৈরি করতে:

main_east_Library
main_west_Roof
main_north_Roof
minor_south_Roof

কিছুটা এইরকম:

$ echo "main_west_library
main_west_roof
main_north_roof
minor_south_roof" | sed 's_\3_upcase(\3)_' 

যদিও এটি দেয়:

sed: -e expression #1, char 16: Invalid back reference

1
কোনও উত্তেজক বা ত্রিহীন ছাড়া আপনার সেড ব্যর্থ হবে যদি আপনি এটি কোনও উত্তরাধিকার বা অন্য কোনও সিস্টেমের জন্য চেষ্টা করেন। উত্তরের কিছু অভিব্যক্তি হ'ল জিএনইউ এক্সটেনশন!
ইকরাবে

উত্তর:


11

জিএনইউ সহ sed:

sed -E 's/[[:alpha:]]+/\u&/3'

প্রতিটি লাইন থেকে চিঠিগুলির তৃতীয় ক্রমকে মূলধন করবে।

প্রতিটি লাইনে অক্ষরের প্রতিটি তৃতীয় ক্রমকে মূলধন করতে :

sed -E 's/(([[:alpha:]]+[^[:alpha:]]+){2})([[:alpha:]]+)/\1\u\3/g'

জিএনইউ দিয়ে পুরো ইনপুটগুলিতে অক্ষরের প্রতিটি তৃতীয় ক্রমকে মূলধন করতে awk:

awk -v RS='[^[:alpha:]]+' -v ORS= '
   NR % 3 == 0 {$0=toupper(substr($0,1,1)) substr($0,2)}
   {print $0 RT}'

বা সাথে perl:

perl -Mopen=locale -pe 's/\p{alpha}+/++$n % 3 == 0 ? "\u$&" : "$&"/ge'

যদিও [[:alpha:]]চরিত্র বর্গ কিছু সিস্টেমে একটু এলোমেলো হতে পারে (গনুহ সিস্টেমে উদাহরণস্বরূপ, যে আরবি বেশী (0123456789) বর্জনের অনেক সংখ্যাসমূহ অন্তর্ভুক্ত), পার্ল এর \p{...}ইউনিকোড অক্ষর বৈশিষ্ট্য উপর ভিত্তি করে তৈরি। সুতরাং \p{alpha}এগুলিতে সমস্ত বর্ণমালার অক্ষর এবং অ-অক্ষর বর্ণমালা বর্ণগুলিও অন্তর্ভুক্ত থাকবে।

এটিতে ডায়াক্রিটিক্সের সমন্বয় অন্তর্ভুক্ত হবে না যদিও এর অর্থ হ'ল Stéphaneদুটি শব্দ পৃথক শব্দ হিসাবে বিবেচিত হবে।

সুতরাং আপনি পরিবর্তে চাইতে পারেন:

perl -Mopen=locale -pe 's/[\p{alpha}\p{mark}]+/++$n % 3 == 0 ? "\u$&" : "$&"/ge'

যদিও এটি শেষ হতে পারে অনেকগুলি সহ।

এছাড়াও নোট করুন যে GNU এর বিপরীতে sed, পার্লস ( যেমন একটি লিগচার চরিত্রটি রয়েছে) (2 অক্ষর এবং ) এর \uমতো শব্দগুলিকে সঠিকভাবে রূপান্তরিত করবে ।fiddleFiddleFi


3

Perl

perl -pe 's/(?:.*?_){2}\K./\u$&/'

এটি আন্ডারস্কোর দিয়ে শেষ হওয়া চরগুলির 2 টি ক্রম গণনা করে, তারপরে পরবর্তী চরটি বড় হবে।


2

আরেকটি জিএনইউ sed:

sed -E 's/([^[:alpha:]])([[:alpha:]])/\1\u\2/2'

এটি ধরে নেওয়া হয় যে লাইনটি সর্বদা একটি শব্দ দিয়ে শুরু হয়।

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