উত্তর:
জিএনইউ সহ sed
:
sed 's/./\&&/2g'
( s
Ubstitute যে ( g
) অক্ষর ( .
) একই (সঙ্গে &
) সঙ্গে পূর্বে &
( \&
) কিন্তু শুধুমাত্র দ্বিতীয় সংঘটন থেকে শুরু ( 2
))।
Portably:
sed 's/./\&&/g;s/&//'
(প্রতিটি ঘটনা প্রতিস্থাপন করুন, তবে তারপরে প্রথমটি মুছে ফেলুন &
যা আমরা চাই না)।
কিছু awk
বাস্তবায়ন সহ (কোনও শূন্য এফএসের জন্য আচরণটি অনির্দিষ্ট হিসাবে POSIX নয়):
awk -F '' -v OFS="&" '{$1=$1;print}'
(সঙ্গে gawk
কয়েক অন্যান্য এবং awk
বাস্তবায়নের, একটি খালি ক্ষেত্র বিভাজক তার চরিত্র সংগঠকদের মধ্যে রেকর্ড splits । আউটপুট ক্ষেত্র বিভাজক ( OFS
) সেট করা হয় &
। আমরা একটি মান নির্ধারণ $1
(নিজেই) রেকর্ড জোর নতুন ক্ষেত্র বিভাজক সঙ্গে দ্বিজ করা এটি মুদ্রণের আগেও NF=NF
কাজ করে এবং অনেকগুলি অবাস্তব বাস্তবায়নে কিছুটা দক্ষ তবে আপনি যখন আচরণটি করেন তখন পসিক্স দ্বারা অনির্ধারিত)
perl
:
perl -F -lape '$_=join"&",@F'
( -pe
যে লাইন কোড চালায়, এবং ফলাফল ছাপে ( $_
); -l
রেখাচিত্রমালা এবং লাইন শেষা w শ স্বয়ংক্রিয়ভাবে পুনরায় যোগ করা; -a
মান @F
মধ্যে বিভেদক সেটে ইনপুট বিভক্ত সঙ্গে -F
।, যা এখানে একটি খালি স্ট্রিং ফলাফলের প্রতিটি ভাষার প্রতিটি অক্ষরের বিভক্ত হয় @F
, তারপরে তাদের 'এবং' দিয়ে যোগ দিন এবং লাইনটি মুদ্রণ করুন))
বিকল্পভাবে:
perl -pe 's/(?<=.)./&$&/g'
(প্রদত্ত প্রতিটি অক্ষর প্রতিস্থাপন করুন এটির আগে অন্য চরিত্রটি রয়েছে (লুক-রেগএক্সএক্স অপারেটরটি (? <= ...))
zsh
শেল অপারেটর ব্যবহার :
in=12345
out=${(j:&:)${(s::)in}}
(আবার, s::
প্যারামিটার সম্প্রসারণ পতাকা ব্যবহার করে একটি খালি ক্ষেত্র বিভাজককে বিভক্ত করুন এবং এর সাথে যোগ দিন &
)
বা:
out=${in///&} out=${out#?}
(কোনও কিছুর প্রতিটি উপস্থিতি (তাই প্রতিটি চরিত্রের আগে) কেএসএস অপারেটর &
ব্যবহার করে প্রতিস্থাপন করুন ${var//pattern/replacement}
(যদিও ksh
খালি প্যাটার্নের অর্থ অন্য কিছু, এবং এখনও অন্য কিছু, আমি কী তা নিশ্চিত নই bash
)) এবং পসিক্স ${var#pattern}
স্ট্রিপিং দিয়ে প্রথমটি সরিয়ে ফেলুন অপারেটর).
ksh93
শেল অপারেটর ব্যবহার :
in=12345
out=${in//~(P:.(?=.))/\0&}
( ~(P:perl-like-RE)
পার্ল-এর মতো নিয়মিত এক্সপ্রেশন ব্যবহার করার জন্য একটি ksh93 গ্লোব অপারেটর (পার্ল বা পিসিআরই এর তুলনায় আলাদা), (?=.)
চেহারা-সামনের অপারেটর হ'ল: এমন একটি চরিত্র প্রতিস্থাপন করুন যা তার নিজের সাথে অন্য একটি চরিত্র অনুসরণ করে \0
) ( ) এবং &
)
বা:
out=${in//?/&\0}; out=${out#?}
(প্রতিটি অক্ষর ( ?
) এর সাথে &
এবং নিজেই ( \0
) প্রতিস্থাপন করুন এবং আমরা অতিশয় একটি মুছে ফেলি)
bash
শেল অপারেটর ব্যবহার :
shopt -s extglob
in=12345
out=${in//@()/&}; out=${out#?}
(হিসাবে একই zsh
, 'গুলি আপনার যা দরকার তা ব্যতীত @()
সেখানে (ক ksh উল্লিখিত glob অপারেটর, যার জন্য আপনার যা দরকার extglob
মধ্যে bash
))।
awk -F '' -v OFS="&" 'NF=NF'
ইউনিক্স ইউটিলিটিস:
fold -w1|paste -sd\& -
ব্যাখ্যা:
"fold -w1"
- প্রতিটি ইনপুট অক্ষরকে তার নিজস্ব লাইনে আবদ্ধ করবে
ভাঁজ - নির্দিষ্ট প্রস্থে ফিট করতে প্রতিটি ইনপুট লাইন মোড়ানো
-w, --width = WIDTH 80 এর পরিবর্তে WIDTH কলাম ব্যবহার করে
%echo 12345|fold -w1
1
2
3
4
5
"paste -sd\& -"
- &
বিভাজক হিসাবে ব্যবহার করে ইনপুট লাইনগুলি একত্রিত করবে
পেস্ট - ফাইলের লাইন মার্জ
-s, --seial সমান্তরাল পরিবর্তে একবারে একটি ফাইল পেস্ট করুন
-d, --delimiters = তালিকাগুলির পরিবর্তে তালিকা থেকে অক্ষর পুনরায় ব্যবহার করুন
%fold -w1|paste -sd\& -
1&2&3&4&5
(দ্রষ্টব্য যে যদি ইনপুটটিতে বেশ কয়েকটি লাইন থাকে তবে তারা এতে যোগদান করবে &
)
echo "abcdeéèfg" | fold -1 | paste -sd\& -
sed
।
sed
নীচে বেশ কয়েকটি ভাল উত্তর পাওয়া যায়। এবং এই কাজটি অন্য উপায়ে কীভাবে সমাধান করা যায় তা প্রদর্শনের ক্ষেত্রে আমি কোনও ক্ষতি দেখছি না।
sed 's/\B/\&/g'
\ বি - সর্বত্র মিলছে তবে একটি শব্দের সীমানায়; এটি কি মিলে যায় যদি বামে অক্ষর এবং ডানে বর্ণের অক্ষর হয় উভয়ই "শব্দ" অক্ষর বা উভয়ই "অ-শব্দ" অক্ষর।
তথ্য: জিএনইউ সেড ম্যানুয়াল, নিয়মিত অভিব্যক্তি এক্সটেনশন ।
পরীক্ষামূলক:
sed 's/\B/\&/g' <<< '12345'
1&2&3&4&5
এটি অন্যান্য উত্তরগুলির তুলনায় কিছুটা ধীর হবে তবে এটি বেশ পরিষ্কার:
echo 12345 | perl -lnE 'say join "&", split //'
এখানে অন্য উপায়। সেড এক্সপ্রেশনটির প্রথম অংশটি প্রতিটি চরিত্রকে ক্যাপচার করে তারপরে এটি চরিত্র এবং একটি অ্যাম্পারস্যান্ডের সাথে প্রতিস্থাপন করে। দ্বিতীয় অংশটি লাইনের প্রান্ত থেকে অ্যাম্পারস্যান্ডটি সরিয়ে দেয়।
echo 12345 | sed -r 's/(.)/\1\&/g;s/\&$//g'
1&2&3&4&5
মাল্টিবাইট চরিত্রগুলিতেও কাজ করে।
sed
দু'বার কল করার দরকার নেই , একটি sed
স্ক্রিপ্টে কয়েকটি কমান্ড থাকতে পারে:sed -r 's/(.)/\1\&/g; s/\&$//g'
012345
ইনপুট