সহজ awk
সমাধান:
অনুমান করুন যে মিলে যাওয়া লাইনগুলি সন্ধানের জন্য ব্যবহার করার জন্য নিয়মিত প্রকাশটি শেল ভেরিয়েবলে সঞ্চিত রয়েছে $regex
এবং এতে এড়াতে লাইনের গণনা $count
।
তাহলে ম্যাচিং লাইন উচিত এছাড়াও এড়ানো হবে ( $count + 1
লাইন এড়ানো হয়েছে হয়):
... | awk -v regex="$regex" -v count="$count" \
'$0 ~ regex { skip=count; next } --skip >= 0 { next } 1'
যদি ম্যাচিং লাইনটি এড়ানো না যায় ( ম্যাচ বাদ দেওয়ার পরে$count
লাইনগুলি ):
... | awk -v regex="$regex" -v count="$count" \
'$0 ~ regex { skip=count; print; next } --skip >= 0 { next } 1'
ব্যাখ্যা:
-v regex="$regex" -v count="$count"
একই নামের শেল ভেরিয়েবলের awk
উপর ভিত্তি করে ভেরিয়েবলগুলি সংজ্ঞায়িত করে ।
$0 ~ regex
আগ্রহের লাইনের সাথে মেলে
{ skip=count; next }
স্কিপ গণনাটি আরম্ভ করে এবং পরবর্তী লাইনে এগিয়ে যায়, কার্যকরভাবে ম্যাচিং লাইনটি এড়ানো যায়; 2nd দ্রবণে, print
সামনে next
নিশ্চিত করে যে এটা হয় না এড়ানো।
--skip >= 0
এড়িয়ে যাওয়া গণনা হ্রাস করে এবং যদি এটি (এখনও)> = 0 হয় তবে পদক্ষেপ নেয়, বোঝায় যে হাতের লাইনটি এড়াতে হবে।
{ next }
পরবর্তী লাইনে এগিয়ে কার্যকরভাবে বর্তমান লাইন এড়ানো
1
এর জন্য সাধারণত ব্যবহৃত শর্টহ্যান্ড { print }
; যে, বর্তমান লাইন সহজভাবে মুদ্রিত হয়
- এই কমান্ডটিতে কেবল মিল না-করা এবং বাদ দেওয়া লাইনই পৌঁছায়।
- এর
1
সমতুল্য কারণটি এটি বুলিয়ান প্যাটার্ন হিসাবে ব্যাখ্যা করা { print }
হয় যা 1
সংজ্ঞার মাধ্যমে সর্বদা সত্যের কাছে মূল্যায়ন করে যার অর্থ এর সাথে সম্পর্কিত ক্রিয়া (ব্লক) নিঃশর্ত কার্যকর করা হয়। যেহেতু এই ক্ষেত্রে কোনও সম্পর্কিত পদক্ষেপ নেই , তাই লাইনটি মুদ্রণের ক্ষেত্রে awk
ডিফল্ট ।
+N
প্যাটার্নটি একটি জিএনইউ এক্সটেনশন। প্রথম পরিবর্তনn
একটি থেকেN
এটা প্যাটার্ন সঙ্গে সঙ্গতিপূর্ণ অন্তর্ভুক্ত করার জন্য আপনার দ্বিতীয় উদাহরণে।