`সেডে আমি কীভাবে একটি স্ট্রিংয়ে অক্ষরের মধ্যে একটি" & "রাখতে পারি?


11

এর sedমতো কিছু তৈরি করতে পারে:

12345

হয়ে:

1&2&3&4&5

?

উত্তর:


25

জিএনইউ সহ sed:

sed 's/./\&&/2g'

( sUbstitute যে ( 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))।


2
@AFSHIN, যে একটি কাজ করবে না 012345ইনপুট
Stéphane Chazelas

1
এই কাজ করা উচিতawk -F '' -v OFS="&" 'NF=NF'
αғsнιη

1
@ আফসিন, তবে খালি লাইনগুলি সরিয়ে দিন। আরও সাধারণভাবে, শর্ত হিসাবে কোনও ক্রিয়াকলাপটি ব্যবহার করার সময় এবং ক্রিয়াটির ফলাফলটি মুদ্রিত হওয়ার উদ্দেশ্যে করার সময়, আপনাকে অবশ্যই নিশ্চিত করতে হবে যে ক্রিয়ায় প্রত্যাবর্তিত মানটি খালি স্ট্রিং বা একটি সংখ্যাসূচক স্ট্রিং নয় যা 0 এ সমাধান হয়েছে
স্টাফেন চ্যাজেলাস

1
এই প্রতিটি কাজ কিভাবে আপনি একটি দ্রুত ব্যাখ্যা যোগ করতে পারেন? দেখে মনে হচ্ছে এখানে কিছু অসাধারণ জিনিস রয়েছে, তবে আমি জানি না যে এই নির্দিষ্ট সমস্যার ক্ষেত্রের বাইরে কীভাবে সেগুলি প্রয়োগ করা যায় তা দেখার জন্য আমি তাদের বেশিরভাগ নিয়ে গবেষণা শুরু করেছিলাম।
IMSoP

1
@ স্টাফেনচাজেলাস উজ্জ্বল, ধন্যবাদ সেডের মতো জিনিসগুলির জন্য জটিল ডকগুলি অনুসন্ধান করা কিছুটা শিল্প, তাই কিছু হ্যান্ড-অন উদাহরণ থাকা নতুন বিটগুলি শেখার দুর্দান্ত উপায় যা আপনি আগে দেখেন নি।
IMSoP

15

ইউনিক্স ইউটিলিটিস:

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

(দ্রষ্টব্য যে যদি ইনপুটটিতে বেশ কয়েকটি লাইন থাকে তবে তারা এতে যোগদান করবে &)


2
মাল্টিবাইট অক্ষর ব্যর্থ। চেষ্টা করুনecho "abcdeéèfg" | fold -1 | paste -sd\& -
আইজাক

3
@Arrow সম্ভবত আপনি শুধুমাত্র একটি ব্যবহার করছেন বগী coreutils সংস্করণ ভাঁজ , যা একটি পূর্ণ ইউনিকোড সমর্থন নেই। বাসদ ভাঁজ, এর redhat-patched সংস্করণ coreutils সেইসাথে (অর্থাত ফেডোরা বা সেন্টওএস) এটি busybox প্রয়োগ, ইউনিকোড শুধু সুন্দর সব ব্যবস্থা করতে সক্ষম।
জেপেলিন

5
প্রশ্নটি বিশেষভাবে সম্পর্কে sed
আলেকজান্ডার

6
@ আলেকজান্ডার - এটি সত্য এবং sedনীচে বেশ কয়েকটি ভাল উত্তর পাওয়া যায়। এবং এই কাজটি অন্য উপায়ে কীভাবে সমাধান করা যায় তা প্রদর্শনের ক্ষেত্রে আমি কোনও ক্ষতি দেখছি না।
জেপেলিন

@ StéphaneChazelas> POSIXly, আপনি -w ভাঁজ প্রয়োজন চাই 1 এটা ঠিক যে, আমি জুড়েছেন "-w", ধন্যবাদ! "-", ঘুরে, প্রয়োজন হয় নাIf no file operands are specified, the standard input shall be used
জেপেলিন


9
sed 's/\B/\&/g'

\ বি - সর্বত্র মিলছে তবে একটি শব্দের সীমানায়; এটি কি মিলে যায় যদি বামে অক্ষর এবং ডানে বর্ণের অক্ষর হয় উভয়ই "শব্দ" অক্ষর বা উভয়ই "অ-শব্দ" অক্ষর।

তথ্য: জিএনইউ সেড ম্যানুয়াল, নিয়মিত অভিব্যক্তি এক্সটেনশন

পরীক্ষামূলক:

sed 's/\B/\&/g' <<< '12345'
1&2&3&4&5

5
আকর্ষণীয় ধারণা কিন্তু প্রশ্নটি বলে না যে স্ট্রিংটিতে কোনও স্থান, একটি বিন্দু বা কোনও শব্দ নেই যা শব্দের সীমানা গঠন করতে পারে। এটি কেবল "অক্ষরের মধ্যে" বলে যা "কোনও অক্ষর" হিসাবে ব্যাখ্যা করা উচিত।
xhienne


4

এখানে অন্য উপায়। সেড এক্সপ্রেশনটির প্রথম অংশটি প্রতিটি চরিত্রকে ক্যাপচার করে তারপরে এটি চরিত্র এবং একটি অ্যাম্পারস্যান্ডের সাথে প্রতিস্থাপন করে। দ্বিতীয় অংশটি লাইনের প্রান্ত থেকে অ্যাম্পারস্যান্ডটি সরিয়ে দেয়।

echo 12345 | sed -r 's/(.)/\1\&/g;s/\&$//g'
1&2&3&4&5

মাল্টিবাইট চরিত্রগুলিতেও কাজ করে।


1
sedদু'বার কল করার দরকার নেই , একটি sedস্ক্রিপ্টে কয়েকটি কমান্ড থাকতে পারে:sed -r 's/(.)/\1\&/g; s/\&$//g'
xhienne

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