যদি কোনও ম্যাচের সাথে সাথে অনুসরণ করা কোনও লাইন অপসারণ করা উচিত তবে আপনার sedপ্রোগ্রামটি পরপর ম্যাচগুলি বিবেচনা করতে হবে। অন্য কথায়, যদি আপনি কোনও ম্যাচের পরেও মিলে যায় এমন একটি লাইন সরিয়ে ফেলেন, তবে সম্ভবত আপনাকে নিম্নলিখিতটি সরিয়ে ফেলতে হবে।
এটি কেবলমাত্র যথেষ্ট কার্যকর করা হয়েছে - তবে আপনাকে কিছুটা পিছনে দেখতে হবে।
printf %s\\n 0 match 2 match match \
5 6 match match match \
10 11 12 match 14 15 |
sed -ne'x;/match/!{g;//!p;}'
0
6
11
12
15
এটি প্রতিটি পঠিত লাইনের জন্য হোল্ড এবং প্যাটার্ন স্পেসগুলি অদলবদল করে কাজ করে - যাতে শেষ লাইনের সাথে প্রতিবারের সাথে তুলনা করা যায়। সুতরাং যখন sedএকটি লাইন পড়েন তখন এটি তার বাফারগুলির বিষয়বস্তুগুলি বিনিময় করে - এবং পূর্ববর্তী লাইনটি তার সম্পাদনা বাফারের সামগ্রীগুলি হয়, যখন বর্তমান লাইনটি ধরে রাখা যায়।
সুতরাং sedএকটি মিলের জন্য পূর্ববর্তী লাইনটি পরীক্ষা করে matchএবং যদি এটি !না পাওয়া যায় তবে {ফাংশনে দুটি এক্সপ্রেশন }চালানো হয়। প্যাটার্ন স্পেসটি ওভাররাইট করে হোল্ড স্পেসটি এট sedকরবে g- যার অর্থ বর্তমান লাইনটি তারপরে হোল্ড এবং প্যাটার্ন উভয় জায়গাতেই থাকবে - এবং তারপরে এটি //তার সাম্প্রতিক সংকলিত নিয়মিত অভিব্যক্তির সাথে মিলের জন্য এটি পরীক্ষা করবে - match- এবং যদি এটি এটি না করে matchতবে হয় printed।
এর অর্থ একটি লাইন কেবল তখনই মুদ্রিত হয় যদি তা না হয় এবং তত্ক্ষণাত্ পূর্ববর্তী লাইনটি না ঘটে । এটি এস এর সিকোয়েন্সগুলির জন্য কোনও অপ্রয়োজনীয় অদলবদলকেও পূর্বসূর করে ।match matchmatch
আপনি যদি এমন একটি সংস্করণ চান যা একটি স্বেচ্ছাসেবীর সংখ্যক লাইনের পরে matchপড়তে পারে তবে এর জন্য আরও কিছুটা কাজের প্রয়োজন হবে:
printf %s\\n 1 2 3 4 match \
match match 8 \
9 10 11 12 13 \
14 match match \
17 18 19 20 21 |
sed -net -e'/match/{h;n;//h;//!H;G;s/\n/&/5;D;}' -ep
... 5 টি প্রতিস্থাপন করুন এমন লাইনের সংখ্যার সাথে (ম্যাচযুক্ত লাইন সহ) যা আপনি মুছে ফেলতে চান ...
1
2
3
4
12
13
14
21