কিভাবে পুনরাবৃত্তভাবে সেড সঙ্গে অক্ষর প্রতিস্থাপন?


13

চরিত্রের ক্রমগুলির পুনরাবৃত্তির সাথে একই ক্রমটির পুনরাবৃত্তি না করে পুনরুক্তি করা সম্ভব?

sedনিম্নলিখিত পরিস্থিতিতে যেমন একটি সম্পাদন করে আমি উল্লিখিত আউটপুট পেতে পারি।

$ echo XX | sed -e 's/XX/XoX/g'
XoX  
$ echo XXX | sed -e 's/XX/XoX/g'
XoXX  
$ echo XXXX | sed -e 's/XX/XoX/g'
XoXXoX  

তবে, আমি আউটপুটটি নিম্নলিখিত আচরণটি অনুসরণ করবে বলে আশা করছি।

ইনপুট:

XX
XXX
XXXX

প্রত্যাশিত আউটপুট:

XoX
XoXoX
XoXoXoX

একা সিডের সাথে প্রত্যাশিত আচরণ করা কি সম্ভব?

উত্তর:


24

আপনি করতে পারেন:

> echo XXXX | sed -e ':loop' -e 's/XX/XoX/g' -e 't loop'
XoXoXoX

সঙ্গে:

  • -e ':loop' : একটি "লুপ" লেবেল তৈরি করুন
  • -e 't loop' : পূর্ববর্তী প্রতিস্থাপন সফল হলে "লুপ" লেবেলে যান

10

এই বিশেষ ক্ষেত্রে চেহারা-এগিয়ে বা চেহারা পিছনে দরকারী হবে। আমি মনে করি জিএনইউ sedএগুলি সমর্থন করে না। সহ perl:

perl -ne 's/X(?=X)/Xo/g; print;'

আপনি লম্বা পিছনের দিকের এবং চেহারাগুলিও ব্যবহার করতে পারেন:

s/(?<=X)(?=X)/o/g

কোথায়:

(?<=X)একটি ইতিবাচক চেহারা, পিছনে একটি শূন্য দৈর্ঘ্যের জোর যা নিশ্চিত করে যে বর্তমান অবস্থানের
(?=X)ইতিমধ্যে ইতিমধ্যে একটি এক্স আছে, এটি একটি শূন্য-দৈর্ঘ্যের জোর যা নিশ্চিত করে যে আমাদের বর্তমান অবস্থানের পরে এক্স আছে

পার্ল ওয়ান-লাইনারে ব্যবহার করা:

perl -pe 's/(?<=X)(?=X)/o/g' inputfile

কোথায়:

-p পার্লকে বর্তমান লাইনের অন্তর্নিহিত মুদ্রণ সহ প্রোগ্রামের চারপাশে একটি লুপ ধরে নিয়েছে


5

লুপিং উত্তরটি যা আপনি জিজ্ঞাসা করছেন তা করার সাধারণ উপায়।

তবে আপনার ডেটার ক্ষেত্রে, ধরে নিই যে আপনি জিএনইউ ব্যবহার করছেন আপনি সহজেই এটি করতে পারেন:

sed 's/\B/o/g'

\bএবং \Bবিকল্প আছে Regex এক্সটেনশন :

  • \b শব্দের সীমানা মেলে, অর্থাত্ একটি "শব্দ" অক্ষর থেকে "নন-শব্দ" অক্ষরে রূপান্তর বা তদ্বিপরীত
  • \Bবিপরীত সাথে মিলে যায় \b। অর্থ শূন্যতা "ভিতরে"। এটি আমাদের শব্দের ভিতরে অক্ষর সন্নিবেশ করতে দেয় তবে প্রয়োজন মতো বাইরে নয়।

এটি অনলাইনে চেষ্টা করুন

এটি ধরে নিয়েছে যে ইনপুট অক্ষরগুলি আসলে সমস্ত "শব্দ" অক্ষর।


বিকল্পভাবে যদি আপনার জিএনইউ সেড না থাকে বা ইনপুট অক্ষরগুলি সমস্ত "শব্দ" অক্ষর না হয় তবে লুপিং ছাড়াই আপনি আপনার লক্ষ্য অর্জন করতে পারেন:

sed 's/./&o/g;s/o$//'

এটি কেবল oপ্রতিটি অক্ষরের পরে একটি স্থানে রাখে এবং তারপরে oস্ট্রিং থেকে ফাইনালটি সরিয়ে দেয় ।

এটি অনলাইনে চেষ্টা করুন


1
এটি ধরে নিয়েছে যে ইনপুট স্ট্রিংগুলিতে কিছু সংখ্যক Xএবং অন্য কিছুই নেই। উপস্থিত অন্যান্য অক্ষর উপস্থিত থাকলে উভয় সমাধানই ব্যর্থ হয় ...
আনোই

@AnE দ্বিতীয় নমুনায় এটি একটি সাধারণ প্রতিস্থাপনের সাথে ঠিক Xকরা হয়েছে .। সম্পাদনা দেখুন।
ডিজিটাল ট্রমা

ওপি প্রদত্ত মামলার সমতুল্য নয়। তিনি তার প্রয়োজনীয় আরইএস দিয়েছেন (একটি স্ট্রিংয়ের এক্সএক্সের ঘটনাগুলি পরিবর্তন করুন)। আপনার সংস্করণগুলি তার দেওয়া ঠিক একই ইনপুট স্ট্রিংগুলির জন্য তার একই ফলাফল দেয়; জেনেরিক ইনপুট স্ট্রিংয়ের জন্য নয়।
AnoE

4

এটি ঘটানোর জন্য কোনও ধরণের পতাকা রয়েছে কিনা তা আমি দেখেছি।
এমনকি যদি সেই আচরণটি এটি ছিল তবে এটি অত্যন্ত সংস্থান গ্রহণ করবে।

তবে, এই বিশেষ ব্যবহারের ক্ষেত্রে, মাত্র দু'বার এক্সপ্রেশন থাকা এবং প্রয়োজনীয় কার্যকারিতা অর্জন করা সম্ভব। অর্থাত্ 2 পুনরাবৃত্তি sedপ্রকাশ সঙ্গে।

echo XX | sed -e 's/XX/XoX/g' -e 's/XX/XoX/g'     # outputs XoX
echo XXX | sed -e 's/XX/XoX/g' -e 's/XX/XoX/g'    # outputs XoXoX
echo XXXX | sed -e 's/XX/XoX/g' -e 's/XX/XoX/g'   # outputs XoXoXoX
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.