আন্ডারস্কোরকে প্যাসকেলকে, অর্থাৎ আপারকামেলকেসে রূপান্তর করুন


28

আমার কাছে যদি এমন স্ট্রিং থাকে যা দেখতে এই রকম হয়:

"this_is_the_string"

একটি বাশ স্ক্রিপ্টের ভিতরে, আমি এটি দেখতে প্যাসকেলকে, অর্থাৎ আপারকামেলকেসে রূপান্তর করতে চাই:

"ThisIsTheString"

আমি দেখেছি যে লোয়ার ক্যামেলকেসে রূপান্তর করা এইভাবে করা যেতে পারে:

"this_is_the_string" | sed -r 's/([a-z]+)_([a-z])([a-z]+)/\1\U\2\L\3/'

দুর্ভাগ্যক্রমে আমি এটিকে সংশোধন করার জন্য রেজেক্সিসের সাথে যথেষ্ট পরিচিত নই।


(১) এই প্রশ্নটি (এবং এখনও অবধি উপস্থাপিত উত্তরগুলি) এটিকে সত্যই গুরুত্ব দেয় না, তবে এফওয়াইআই, \U\2দ্বিতীয় গ্রুপের প্রাপ্ত পাঠ্যকে সমস্ত ক্যাপগুলিতে রূপান্তর করে। তুলনা করুন \u\2, যা বাক্য ক্ষেত্রে সারণি সন্নিবেশ করায় কেবল প্রথম অক্ষরকে মূলধন দিয়ে। (২) নীচে প্রদত্ত সমস্ত উদাহরণ "এই_আইস_এ_স্ট্রিং" "" এইআইএসএএসটিং "- তে অনুবাদ করবে - যা আপনি যা চেয়েছিলেন তা কিন্তু পড়তে কিছুটা শক্ত। আপনি এক-অক্ষরের শব্দের (সাবস্ট্রিং) বিশেষ ক্ষেত্রে আপনার প্রয়োজনীয়তাগুলি সংশোধন করতে চাইতে পারেন। … (চালিয়ে যাওয়া)
স্কট

(চালিয়ে যাওয়া) ... (3) আপনার প্রতি লাইনে কেবল একটি মাত্র স্ট্রিং রয়েছে? এবং এটি কি সর্বদা লাইনের প্রথম (বা একমাত্র ) পাঠ্য? আপনার যদি একটি স্ট্রিং থাকে যা লাইনের শুরুতে নয়, নীচের উত্তরগুলি এটিকে লোয়ারকামেলকে রূপান্তর করবে। ঠিক করার জন্য, জ্যানিসের উত্তর নিন এবং এতে পরিবর্তন (^|_)করুন (\<|_)
স্কট

উত্তর:


44
$ echo "this_is_the_string" | sed -r 's/(^|_)([a-z])/\U\2/g'            
ThisIsTheString

সাবস্টিটিউট প্যাটার্ন
(^|_)স্ট্রিং শুরুতে বা একটি আন্ডারস্কোর পর - প্রথম গ্রুপ
([a-z])একক ছোট হাতের পত্র - দ্বিতীয় গ্রুপ
দ্বারা
\U\2দ্বিতীয় গ্রুপ uppercasing
gবিশ্বব্যাপী।


4
দ্রষ্টব্য: \Uপসিক্সের একটি জিএনইউ এক্সটেনশন।
সিরো সান্তিলি 新疆 改造 中心 法轮功 六四 事件

1
কেবল একটি নোট, আপনারও সংখ্যা ক্যাপচার করা উচিত sed -r 's/(^|[-_ ]+)([0-9a-z])/\U\2/g'। সুতরাং "এই_আইস_আন্দ_আর_তারা" এর মতো স্ট্রিংও কাজ করে।
পিনকেন

9

যেহেতু আপনি ব্যবহার করছেন bash, আপনি যদি আপনার স্ট্রিংটি একটি ভেরিয়েবলের মধ্যে সঞ্চয় করেন তবে আপনি এটি কেবল শেল-ই করতে পারেন:

uscore="this_is_the_string_to_be_converted"
arr=(${uscore//_/ })
printf %s "${arr[@]^}"
ThisIsTheStringToBeConverted

${uscore//_/ }_স্থানের সাথে সমস্ত প্রতিস্থাপন (....)করে, স্ট্রিংটিকে একটি অ্যারেতে বিভক্ত করে, ${arr[@]^}প্রতিটি উপাদানটির প্রথম অক্ষরকে আপার ক্ষেত্রে রূপান্তরিত করে এবং তারপরে printf %s ..সমস্ত উপাদান একের পর এক মুদ্রণ করে।
আপনি উট-কেসযুক্ত স্ট্রিংটিকে অন্য ভেরিয়েবলের মধ্যে সঞ্চয় করতে পারেন:

printf -v ccase %s "${arr[@]^}"

এবং পরে এটি ব্যবহার / পুনরায় ব্যবহার করুন, যেমন:

printf %s\\n $ccase
ThisIsTheStringToBeConverted

বা, এর সাথে zsh:

uscore="this_is_the_string_to_be_converted"
arr=(${(s:_:)uscore})
printf %s "${(C)arr}"
ThisIsTheStringToBeConverted

(${(s:_:)uscore})স্ট্রিংটিকে _একটি অ্যারেতে বিভক্ত করে (C)প্রতিটি উপাদানের প্রথম অক্ষরকে মূলধন দেয় এবং printf %s ...সমস্ত উপাদান একের পর এক মুদ্রণ করে ..
এটি অন্য ভেরিয়েবলে সংরক্ষণ করতে আপনি (j::)উপাদানগুলিতে যোগ দিতে পারেন :

ccase=${(j::)${(C)arr}}

এবং পরে এটি ব্যবহার / পুনরায় ব্যবহার করুন:

printf %s\\n $ccase
ThisIsTheStringToBeConverted

8

এখানে একটি পার্ল উপায়:

$ echo "this_is_the_string" | perl -pe 's/(^|_)./uc($&)/ge;s/_//g'
ThisIsTheString

এটি নির্বিচারে দৈর্ঘ্যের স্ট্রিংগুলির সাথে ডিল করতে পারে:

$ echo "here_is_another_larger_string_with_more_parts" | 
    perl -pe 's/(^|_)./uc($&)/ge;s/_//g'
HereIsAnotherLargerStringWithMoreParts

এটি .স্ট্রিং শুরুর পরে বা আন্ডারস্কোর ( (^|_)) এর পরে আসা যে কোনও অক্ষরের ( ) সাথে মেলে এবং এটি নিজের ( uc($&)) এর উপরের কেস সংস্করণ দিয়ে প্রতিস্থাপন করবে । $&এটি একটি বিশেষ চলক যা কেবল যা মেলে তা ধারণ করে। eশেষে s///ge(এক্সপ্রেশন ব্যবহার করতে পারবে uc()প্রতিকল্পন মধ্যে এই ক্ষেত্রে ফাংশন) এবং gএটি প্রতিস্থাপন করে তোলে সব লাইনে ঘটনার। দ্বিতীয় প্রতিস্থাপন আন্ডারস্কোরগুলি সরিয়ে দেয়।


পার্লের কথা বললে, একটি পার্ল মডিউলও রয়েছে স্ট্রিং :: ক্যামেলকেস যা আন্ডারকর্ড করা পাঠ্যকে "উটায়িত করে"।
don_crissti

@ ডন_ক্রিসটি ওহ, এটির জন্য নিখুঁত শোনায়। ধন্যবাদ।
টেরডন

সংক্ষিপ্ত পার্ল:perl -pe 's/(^|_)([a-z])/uc($2)/ge'
আইজ্যাক

6

নিয়মিত এক্সপ্রেশন ম্যাচে পুরো স্ট্রিংটি উপস্থাপন করার প্রয়োজন হয় না - সেডে এমন একটি /gমডিফায়ার রয়েছে যা আপনাকে একাধিক ম্যাচ ধরে হাঁটতে এবং সেগুলির প্রতিটি প্রতিস্থাপন করতে দেয়:

echo "this_is_the_string" | sed 's/_\([a-z]\)/\U\1/g;s/^\([a-z]\)/\U\1/g'

প্রথম রেজেক্সটি হ'ল _\([a-z]\): প্রতিটি অক্ষর আন্ডারস্কোরের পরে; দ্বিতীয়টি প্রথম অক্ষরের সাথে একটি স্ট্রিংয়ের সাথে মেলে।


3

আমি কেবল এই উত্তরটি রেখেছি কারণ এটি এখন পর্যন্ত অন্য যে কোনও তুলনায় স্বল্প এবং সহজ ler

sed -re "s~(^|_)(.)~\U\2~g"

এটি বলে: আপসেস, চরিত্রটি একটি _বা শুরু করার পরে। নন-চিঠিগুলি পরিবর্তন করা হবে না, কারণ তাদের কোনও মামলা নেই।


1
"সবকিছু যতটা সম্ভব সহজ করা উচিত, তবে সহজ নয়।" - আলবার্ট আইনস্টাইন. এটি অন্যান্য উত্তরের সমতুল্য নয়; আপনার উত্তর "FOO_BAR" কে "FOOBAR" এ রূপান্তর করবে, অন্য উত্তরগুলি এটিকে একা ছেড়ে দেবে।
স্কট 21

@ স্কট আহঃ হ্যাঁ, আমি এটি ভাবিনি।
ctrl-alt-delor

1
@ স্কট কি এটি পছন্দসই আচরণ নয়? আমি অনুমান করি যে আদর্শভাবে, এটি হওয়া উচিত FooBarতবে নির্দেশাবলী অনুসারে আন্ডারস্কোরটি সরানো উচিত। আমি যাইহোক নির্দেশাবলী বুঝতে।
টেরডন

2
(চালিয়ে যাওয়া) ... (3) আমি মনে করি এটি কিছুটা পরিষ্কার হয়ে গেছে যে প্রশ্নের স্পিরিটটি একটি স্ট্রিংকে রূপান্তর করা যাতে শব্দটি আন্ডারস্কোর ( _) দ্বারা নির্দেশিত বিরতি পরিবর্তে কেস ট্রান্সজিশন দ্বারা নির্দেশিত হয়। প্রদত্ত, "FOO_BAR" - "FOOBAR" স্পষ্টতই ভুল (এটি শব্দ বিরতির তথ্যকে অস্বীকার করে) যদিও "FOO_BAR" - "FooBar" সঠিক হতে পারে। (৪) একইভাবে, সংঘর্ষের কারণ হিসাবে তৈরি হওয়া ম্যাপিংটি প্রশ্নের আত্মার বিরোধী বলে মনে হচ্ছে। উদাহরণস্বরূপ, আমি বিশ্বাস করি যে একটি উত্তর যা "ডিওএসপিআরটিএস" এবং "ডসপোর্টস" কে একই লক্ষ্যে রূপান্তর করে তা ভুল।
স্কট

1
(আবার অবিরত) ... (৫) সংঘর্ষ না ঘটানোর চেতনায়, আমার কাছে মনে হয় যে "foo_bar" এবং "FOO_BAR" একই জিনিসকে মানচিত্রযুক্ত করা উচিত নয়, তাই আমি "FOO_BAR" - "FooBar" এ আপত্তি জানাই । ()) আমি মনে করি বড় সমস্যাটি হ'ল নামস্থান। ব্লেইস বেঁচে থাকার পর থেকে আমি পাসকালে প্রোগ্রাম করি নি, তবে সি / সি ++ তে, কনভেনশন অনুসারে, প্রাথমিকভাবে নিম্নের ক্ষেত্রে (সর্পকেস এবং ক্যামেলকেস অন্তর্ভুক্ত করা) সনাক্তকারীগুলি সাধারণত সংকলকের ডোমেন হয়, তবে উপরের ক্ষেত্রে সনাক্তকারীগুলি হয় প্রাক প্রসেসরের ডোমেন। সে কারণেই আমি মনে করি যে ওপি ALL_CAPS শনাক্তকারীদের বিবেচনা করা উচিত নয়।
স্কট

1

পার্ল ইন:

$ echo 'alert_beer_core_hemp' | perl -pe 's/(?:\b|_)(\p{Ll})/\u$1/g'
AlertBeerCoreHemp

এটি i18n- সক্ষমও:

$ echo 'алерт_беер_коре_хемп' | perl -CIO -pe 's/(?:\b|_)(\p{Ll})/\u$1/g'
АлертБеерКореХемп

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