তাদের সহ দুটি প্যাটার্নের মধ্যে কীভাবে প্রথম উপস্থিতি নির্বাচন করবেন


27

আমি তাদের সহ দুটি নিদর্শনগুলির মধ্যে প্রথম উপস্থিতিটি কীভাবে নির্বাচন করতে পারি। সাধারণত ব্যবহার sedবা awk

আমার আছে:

text
something P1 something
content1
content2
something P2 something
text
something P1 something
content3
content4
something P2 something
text

আমি পি 1 এবং পি 2 (পি 1 লাইন এবং পি 2 লাইন সহ) এর মধ্যে লাইনগুলির প্রথম উপস্থিতিটি চাই:

something P1 something
content1
content2
something P2 something

উত্তর:


22
sed '/P1/,/P2/!d;/P2/q'

... পরিসরের মধ্যে পড়ে না dএমন সমস্ত লাইন একুশের মাধ্যমে পোর্টেবলভাবে কাজটি করা হবে !, তারপরে qপ্রথমবার যখন এটি ব্যাপ্তির শেষের মুখোমুখি হবে u এটি পি 2 এর পূর্ববর্তী পি 1 এর জন্য ব্যর্থ হয় না এবং এটি সহজভাবে লিখতে GNU নির্দিষ্ট বাক্য গঠন প্রয়োজন হয় না।


অসাধারণ! আমার চেয়ে অনেক ভাল।
মারু

1
@ মুরু - আপনি স্বতঃপ্রণালী লক্ষ্য করে দেখার চেষ্টা করলে কনট্রোশনগুলি এড়ানো প্রায়শই সহজ - আপনার জন্য চক্রটি কাজ করতে দিন। যে অভ্যাস আমি যাই হোক না কেন পড়েছি। আমি মনে করি এটি সম্ভবত একটি নির্বাচিত পদ্ধতিতে ছাঁটাই হিসাবে সেরা হিসাবে বর্ণনা করা হয়েছে - আমি কোনও প্যাটার্নটি অনুসন্ধান করার পরিবর্তে অবহেলা করতে চাই wind
মাইক্রজারভ

বিশাল ফাইল সাইজ প্রক্রিয়া করার সময় এটি স্তব্ধ হয়ে যাবে।
ব্রেইন 90

@ মস্তিষ্ক 90 - কাঁটা যদি আপনি নির্ভরযোগ্যভাবে আপনার অভিযোগটি পুনরায় উত্পাদন করতে পারেন তবে আপনার sed... এর রক্ষণাবেক্ষণকারীকে sedসম্বোধন করা উচিত, এটি আপনার চলমান স্থানে একটি বাগ দেয় , উপরের টিবে স্ক্রিপ্টে নয়।
মাইকজার্ভ

1
@ মাইক্রোজার আমি না থাকলে এটি বলতাম না। আমি বেশ কয়েকটি চরিত্রের যত্ন নেব কিনা তা নিয়ে আপনার উদ্বেগ অদ্ভুত: আমি লক্ষ্য করেছি যে এই সিড এক্সপ্রেশনটি /P2/qআমার সিস্টেমের সাথে এবং ছাড়া উভয়ই কাজ করেছিল ; এটাই. আমি কিছু সম্পর্কে কৌতূহল ছিল এবং আমি যা পেয়েছি তা ভাগ করতে চেয়েছিলাম।
আলেকজ মাগুরা

8

সঙ্গে awk

awk '/P1/{a=1};a;/P2/{exit}' file
something P1 something
content1
content2
something P2 something

8

ইন sed:

sed -n '/P1/,/P2/p; /P2/q'
  • -nডিফল্ট মুদ্রণ দমন করে, এবং আপনি pকমান্ডটি ব্যবহার করে ম্যাচিং অ্যাড্রেস রেঞ্জের মধ্যে লাইনগুলি মুদ্রণ করেন।
  • সাধারণত এটি উভয় বিভাগের সাথেই মিলবে, সুতরাং qপ্রথম P2ম্যাচ করার সময় আপনি ( ) ছেড়ে যান ।

যদি এর P2আগে আসে তবে এটি ব্যর্থ হবে P1। এই কেসটি পরিচালনা করতে, চেষ্টা করুন:

sed -n '/P1/,/P2/{p; /P2/q}'

1
আমি দ্বিমত পোষণ করি; মাইকজার্জারের উত্তরটি আপনার চেয়ে ভাল আর কিছু নয়।
জি-ম্যান বলেছেন 18 '

@ g-man - pshaw। কিন্তু আমি ঠিক একই জিনিস চিন্তা ছিল।
মাইকসার্ভ

1
@gman - না এখন আমি এটি পেয়েছি খনি ভাল উপায়। না {স্ট্যাক}!
মাইক্রজারভ

1

আপনি যদি নিজেরাই নিদর্শনগুলি এড়িয়ে যেতে চান তবে awkসংস্করণটি এখানে :

awk '/P2/ {exit} /P1/ {f=1; next} f' file

আমার জন্য কাজ কর. কমান্ডটি কীভাবে কাজ করে সে সম্পর্কে আপনি আরও কিছু তথ্য যুক্ত করতে পারেন?
0x এএফএফ

1

একটি সহজতর awk(মাঝে সাজানোর অফ সমাধান Iruvar এর উত্তর এবং  muru এর উত্তর , কিন্তু একটি পরিবর্তনশীল ব্যবহার করছেন না):

awk '/P1/,/P2/ { print }  /P2/ { exit }'

এবং, যেমন মুড়ু উল্লেখ করেছে, প্রথম পি 1 যদি প্রথম প 1 এর আগে উপস্থিত হয় তবে এটি কিছুই প্রিন্ট করবে না।

অবশ্যই, আপনি যদি সমস্ত P1-P2 রেঞ্জ মুদ্রণ করতে চান:

something P1 something
content1
content2
something P2 something
something P1 something
content3
content4
something P2 something

শুধু exitঅংশটি ছেড়ে দিন :

awk '/P1/,/P2/ { print }'

1
awk '/P1/,/P2/{print;f=1} f&&/P2/{exit}' data

মুদ্রণের পরপরই প্রস্থান করুন, এর আগে নয়।


0

নিদর্শনগুলি এড়িয়ে যাওয়ার জন্য এবং একক জিএনইউ সেডে কেবল প্রথম ম্যাচিং ব্লক প্রদর্শন করুন:

sed -nre '/STARTPATTERN/ {:a;n;/ENDPATTERN/{b;};p;ba}' file
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.