শেড: প্রতি দ্বিতীয় নতুন লাইনে প্যাটার্নটি প্রতিস্থাপন করবেন?


10

sedপ্রতি দ্বিতীয় ঘটনাটিতে প্যাটার্নটি প্রতিস্থাপন করার কোনও উপায় আছে কি ? বা কমপক্ষে প্রতিটি দ্বিতীয় লাইনে? (অবশ্যই এটি কোনও স্ক্রিপ্টের মাধ্যমে সম্ভব, তবে আমি নিজেকে জিজ্ঞাসা করছিলাম sedএটি এটি করতে পারে কিনা)।

সম্পাদন করা

আমি পেয়েছি

sed -e "s/pattern/replacement/g;n"

তবে এটি প্রতিটি প্রথম ঘটনা প্রতিস্থাপন করেছে, দ্বিতীয়টি নয়।

উদাহরণ

ইনপুট ফাইল:

I have a pattern in each line
Also the second line has the pattern
Another pattern here
And -- you guess it -- a pattern

পছন্দসই আউটপুট:

I have a pattern in each line
Also the second line has the replacement
Another pattern here
And -- you guess it -- a replacement

উত্তর:


6

দেখতে /programming/5858200/sed-replace-every-nth-occurrence

সমাধানটি শেডের পরিবর্তে বিশ্রী ব্যবহার করে তবে "কাজের জন্য সঠিক সরঞ্জামটি ব্যবহার করুন"। সেডে এটি করা বা নাও সম্ভব হতে পারে তবে এটি যদি হয় তবে অ্যাডাব্লু বা পার্লের মতো কোনও সরঞ্জামে এটি অনেক সহজ হবে ।


1
আমি সেখানে sed -e 'n;s/2004-2009/6e législature/g'যা শিখেছি তা ব্যবহার করে আমি দাসী করেছিলাম যা আমার সমস্যার সমাধান করেছে।
ম্যাথিউ রিগলার

1
এটি প্রতি দ্বিতীয় ঘটনাটি পাবেন না , এটি প্রতি দ্বিতীয় লাইনে আপনার প্যাটার্ন অনুসন্ধান করবে । অর্থাত্ 1 ম, তৃতীয়, 5 তম, 7 ম, ইত্যাদি লাইনগুলি এড়িয়ে যান। অবশ্যই, এটি এখনও আপনার নির্দিষ্ট নথির জন্য কাজ করতে পারে।
কাস

হ্যাঁ আমি জানি। এটাই আসলে আমার দরকার ছিল
ম্যাথিউ রিগলার

14
sed 's/pattern/replacement/2'

প্যাটার্নযুক্ত প্রতিটি লাইনে দ্বিতীয় ঘটনাটি প্রতিস্থাপন করবে।


আপনার যদি জিএনইউ থাকে sed:

sed '1~2N ; s/pattern/replacement/2'

এক লাইন থেকে শুরু করে 1, রেখার পরে প্যাটার্ন স্পেসে যুক্ত করা হবে Nতখন sকমান্ডটি প্যাটার্নের দ্বিতীয় ঘটনাটি প্রতিস্থাপন করবে। তারপরে sedদুটি লাইন নীচে সরানো হবে ~2এবং পুনরাবৃত্তি করবে।


আমি দ্বিতীয়টি চাই না তবে প্রতি সেকেন্ডে চাই।
ম্যাথিউ রিগলার

আমার প্রতি লাইনে একটি প্যাটার্ন রয়েছে। যে কাজ করবে না।
ম্যাথিউ রিগলার

এর আগে জেনে ভালো লাগতো সুতরাং প্যাটার্নটি এক, দুই, তিন এবং চার (ইত্যাদি) লাইনে ঘটে এবং আপনি প্যাটার্নটি লাইনে দুই, চার, ইত্যাদি প্রতিস্থাপন করতে চান?
llua

একটি সংক্ষিপ্ত বিকল্প হতে পারে code('1 ~ 2s / প্যাটার্ন / প্রতিস্থাপন /')
japap

2

সহজ ব্যাখ্যা:

PATTERN এর কমপক্ষে একটি ঘটনা উপস্থিত প্রথম লাইনে আপনি এটিকে উপেক্ষা করতে এবং যেমনটি লাইনটি মুদ্রণ করতে চান। দ্বিতীয় লাইনে PATTERN এর কমপক্ষে একটি ঘটনা রয়েছে আপনি PATTERN এর প্রথম দৃষ্টান্তটি প্রতিস্থাপনের সাথে প্রতিস্থাপন করতে চান। তৃতীয় লাইনে PATTERN এর অন্তত একটি ঘটনা রয়েছে যা আপনি যেমন লাইনটি মুদ্রণ করতে চান। চতুর্থ লাইনে PATTERN এর কমপক্ষে একটি ঘটনা রয়েছে আপনি PATTERN এর প্রথম উদাহরণটিকে প্রতিস্থাপনের সাথে প্রতিস্থাপন করতে চান। ইত্যাদি। PATTERN এর সাথে মেলে না এমন লাইনগুলি পরিবর্তন ছাড়াই মুদ্রণ করা উচিত।

এটি শেডের মতো সহজেই যেমন করা যায়:

sed -e '/PATTERN/ { :inside' -e 'n;s//REPLACEMENT/;t' -e 'b inside' -e '}'

বা, কম সাদা স্থান এবং একটি ছোট লেবেল সহ:

sed -e '/PATTERN/{:i' -e 'n;s//REPLACEMENT/;t' -e 'b i' -e '}'

সম্পাদনা: আমি কেবল প্রশ্নটি আবার পড়েছি এবং কঠোর ব্যাখ্যাটি খুঁজে পেয়েছি:

পুরো দস্তাবেজে PATTERN- র দ্বিতীয় ঘটনাটি প্রতিস্থাপনের সাথে প্রতিস্থাপন করুন, এটি প্রথম লাইন হিসাবে একই লাইনে ঘটে কিনা। প্রথম এবং তৃতীয় ঘটনাটি আনল্যাটারড ছেড়ে দিন। প্রভৃতি

আমি বিশ্বাস করি এটি শেডের সাথেও করা সম্ভব, যদিও এটি অনেক বেশি কৌশলযুক্ত এবং আমি বিশ্বাস করি এটি নিয়মিত প্রকাশের উপর নির্ভরশীল dependent আমি কিছু কাজ করার চেষ্টা করব এবং এটি পোস্ট করব তবে আমি এই উত্তরটি আপাতত সহজ সংস্করণ দিয়ে দাঁড়াতে দেব।


আপনার প্রতিস্থাপন tএকটি সঙ্গে হল qUIT মত ইনপুট নিতে, { sed '...'; cat; } <inputশুধুমাত্র একটি একক প্রতিস্থাপন জন্য
mikeserv

1

আপনি খুব কাছাকাছি ছিলেন, কেবল প্রথম লাইনটি এড়িয়ে যান:

sed '1n;s/pattern/replacement/;n'

awkএই ক্ষেত্রে কেন আরও ভাল সরঞ্জাম হওয়া উচিত ?


0

এক লাইনের মধ্যে একটি প্রতীক নিদর্শন: সেডস / (এ [^ এ] *) এ / \ 1 সি / জি '

প্রতি দ্বিতীয় প্যাটার্ন (প্রতি লাইনে কেবল একটি প্যাটার্ন ম্যাচ প্রদর্শিত হতে পারে one এক লাইনে দুই বা ততোধিক ম্যাচ প্রদর্শিত হলে কেবল দ্বিতীয়টি প্রতিস্থাপন করা হবে)

echo -e "test\nreplace_me\ntest\ntest\nreplace_me\nreplace_me\nreplace_me" | \
sed '/replace_me/{:a;N;/replace_me.*replace_me/!Ta;s/replace_me/replaced/2;}'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.