নির্দিষ্ট অক্ষর দিয়ে শুরু কিছু লাইন অপসারণ করতে bash স্ক্রিপ্ট ব্যবহার করে


0

আমার নিম্নলিখিত ফরম্যাটে একটি ফাইল আছে:

--- V1 ---
Hi there
--- V2 ---
--- V3 ---
What's good
--- V4 ---
--- V5 ---
--- V6 ---

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

--- V1 ---
Hi there
--- V3 ---
What's good

আমি সহজেই ড্যাশের সাথে শুরু হওয়া সমস্ত লাইন মুছে ফেলতে পারি, তবে নিম্নলিখিত লাইনের উপর ভিত্তি করে কীভাবে এটি করতে হবে তা জানবেন না (অথবা বিকল্পভাবে, নন-ড্যাশেড লাইনগুলির পূর্বে লাইনের উপর ভিত্তি করে)।


সম্ভবত আপনার প্রশ্নের উত্তর নেই, তবে 1 লাইনের আংশিক সমাধান - grep -v-B1 "^ ---" file.name সমস্ত লাইন সন্ধান করবে যা "---" দিয়ে শুরু হবে না এবং সেগুলি প্রদর্শন করবে এবং লাইন লাইন অবিলম্বে আগে। এটি কেবল তখনই কাজ করবে যদি প্রতিটি পেলড লাইন অনুসরণ করা হয় এবং "---" সহ একটি লাইন দ্বারা পূর্ববর্তী হয়, অর্থাৎ একাধিক লাইনগুলিতে কাজ করবে না।
davidgo

এটা কি পারে আছে একটি bash স্ক্রিপ্ট হতে? এই মত কিছু sed, grep, awk, বা এমনকি vim সঙ্গে সম্পন্ন করা যেতে পারে।
Mikey T.K.

এটি একটি bash স্ক্রিপ্ট হতে হবে না, না। Grep ব্যবহার করে না একটি bash স্ক্রিপ্ট থেকে এটি অযোগ্য না, যদিও?
Birdie

@ ডেভিডগো আপনার উত্তরটি আসলে একাধিক লাইনের জন্য সঠিকভাবে কাজ করেছে, তাই আপনি যদি এটি উত্তর দিতে চান তবে মুক্ত মনে করুন এবং আমি এটি সঠিকভাবে চিহ্নিত করব। অন্যথায় আমি গোম্বাই স্যান্ডর এর উত্তরটি গ্রহণ করব, যা আরও জটিল কিন্তু সঠিক।
Birdie

এর জন্য ধন্যবাদ. আমি মনে করি Gombai Sandors উত্তর বেশ শান্ত তাই আমি এটি upvoted, কিন্তু আমি খনি যোগ কারণ আমি এটা অনেক সহজ এবং আরো দক্ষ মনে করি।
davidgo

উত্তর:


0
grep -v -B1 "^---" file.name 

"---" দিয়ে শুরু না হওয়া সমস্ত লাইন সন্ধান করবে এবং সেই লাইনগুলি প্রদর্শন করবে। "-বি 1" পূর্বে লাইন অবিলম্বে প্রদর্শন করে।


2

আমি অনুমান "কিছু ধরনের" মানে আপনি বিশুদ্ধ bash উপর জোর না। যদি তাই হয়, তারপর awk এটি ভাল করতে পারেন:

/tmp$ input="--- V1 ---
Hi there
--- V2 ---
--- V3 ---
What's good
--- V4 ---
--- V5 ---
--- V6 ---"
/tmp$ echo "$input" | awk '/^---/ {row = $0; if (wasdashed) next; wasdashed=1; next}; { if (wasdashed) print row; print $0}'
--- V1 ---
Hi there
--- V3 ---
What's good
/tmp$

যাইহোক, একই যুক্তি সঙ্গে, বিশুদ্ধ bash সম্ভব হবে, কিন্তু আরো কোডিং সঙ্গে।


এই আমার জন্য সম্পূর্ণ ভিন্ন আউটপুট দেয়; --- V1 --- প্রতি লাইন পরে পুনরাবৃত্তি করা হয়, কিন্তু অন্যথায় ইনপুট হিসাবে একই আউটপুট হয়।
Birdie

@ বার্ডি উপরে উল্লেখিত উদাহরণ কপি / পেস্ট করার সময় নেতৃস্থানীয় স্পেসগুলি ড্রপ করতে ভুলবেন না। তারপর জরিমানা কাজ করে।
Oldskool
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.