অন্যান্য নির্দিষ্ট ম্যাচ না হওয়া পর্যন্ত প্রতিটি গ্রেপ ম্যাচের পরে কীভাবে লাইনগুলি প্রদর্শন করবেন?


44

আমি জানি যে "-A NUM"সুইচটি ব্যবহার করে আমি প্রতিটি ম্যাচের পরে নির্দিষ্ট সংখ্যক ট্রেলিং লাইনগুলি মুদ্রণ করতে পারি। আমি কেবল ভাবছি যে প্রতিটি ম্যাচের পরে একটি নির্দিষ্ট শব্দ পাওয়া না যাওয়া পর্যন্ত ট্রিলিং লাইনগুলি মুদ্রণ করা সম্ভব কিনা। উদাহরণস্বরূপ, যখন আমি "ওয়ার্ড এ" অনুসন্ধান করি তখন আমি "ওয়ার্ড ডি" ধারণকারী লাইনটি এবং তারপরে লাইনগুলি দেখতে চাই যেখানে "ওয়ার্ড ডি" থাকে না এমনটি হওয়া পর্যন্ত।

প্রসঙ্গ:

Word A
Word B
Word C
Word D
Word E
Word F

কমান্ড প্রয়োগ করুন:

grep -A10 'Word A'

আমার এই আউটপুটটি দরকার:

Word A
Word B
Word C
Word D

উত্তর:


73

দেখে মনে হচ্ছে আপনি ' Word A' এবং ' Word D' (অন্তর্ভুক্ত) এর মধ্যে লাইনগুলি মুদ্রণ করতে চান । আমি আপনাকে sedপরিবর্তে ব্যবহার করার পরামর্শ দিচ্ছি grep। এটি আপনাকে এমন একটি ইনপুট স্ট্রিমের সম্পাদনা করতে দেয় যা শুরুতে এবং আপনার পছন্দ মতো নিদর্শনগুলির সাথে শেষ হয়। আপনার কেবলমাত্র sedসমস্ত লাইন পরিসরে এবং অন্য কোনও লাইন মুদ্রণ করতে বলা উচিত :

sed -n -e '/Word A/,/Word D/ p' file

কীভাবে এটিকে একচেটিয়া করা যায় তার কোনও পরামর্শ (কোনও জেনেরিক পরিস্থিতির জন্য, কেবল ওপির নয়)?
2rs2ts

4
@ 2rs2ts এটিকে একচেটিয়া করার জন্য, কেবল যুক্ত করুন | sed -e '1d;$d', এটি প্রথম এবং শেষ লাইনটি মুছে ফেলা হবে
হলোরয়ে

এবং যদি আপনি এর মধ্যে সমস্ত লাইন বাদ দিতে চান - অর্থাৎ, আপনি কেবল দুটি ম্যাচের বাইরে থাকা লাইনগুলি দেখতে চান - তবে: sed -n -e '/pattern A/,/pattern D/d; p'এটি বলে, "প্যাটার্ন এ থেকে প্যাটার্ন ডি তে মুছুন এবং সমস্ত কিছু মুদ্রণ করুন"। দুর্ভাগ্যক্রমে, এই ম্যাচটি লোভী। এর অর্থ যদি প্যাটার্ন A এবং D একাধিকবার প্রদর্শিত হয়, আপনি প্রথম প্যাটার্ন এ থেকে শেষ প্যাটার্ন ডি তে মিলতে চলেছেন I'm আমি ভয় করি পার্ল বা পাইথন যদি আপনার বন্ধু হয় তবে সে ক্ষেত্রে।
fbicknel

16

কেন বিশ্রী ব্যবহার করবেন না?

awk '/Word A/,/Word D/' filename

2
বড় বড় সংখ্যক ফাইল জড়িত থাকলে সেড আরও কার্যকরভাবে এটি করতে সক্ষম হবে বলে মনে হয়। awk স্মরণে রাখা সহজ হতে পারে তবে আমার মস্তিষ্কে এটি একটি স্টিকি নোট হিসাবে মূল্যবান বলে মনে হচ্ছে।
জিমনিম

1
যদি Word Dএকই রেখায় পড়ে যায় Word Aএবং সম্ভবত অন্য কোথাও যেমন উদাহরণস্বরূপ Word A Word D\nWord Dদুটি দুটি লাইন দেখায় যেখানে খালি হিসাবে একটি বিভক্ত দেখাবে তখন ডাবলুডুটি উচ্চতর । অতিরিক্ত হিসাবে কেউ এখনও অবাস্তব সাথে ভেরিয়েবল ব্যবহার করতে পারে, উদাহরণস্বরূপ awk -v _word="Word A" '$0 ~ _word,/Word D/' "/some/file", সম্ভবত আরও দক্ষ হয়ে উঠবেন তবে দুটি স্ট্রিংয়ের অনুসন্ধানের ক্ষেত্রে যখন একই লাইনে পড়তে পারে বা না-যেতে পারে, অবশ্যই অবাক আরও নির্ভরযোগ্য।
এস 0 এন্ড এস 0

এটা যে awk ভাল বলে মনে হয় কেস যে ফাইল ক্রমের সাথে রয়েছে পরিচালনা Aএবং Bএবং আপনি শুধুমাত্র প্রতিটি যেমন ক্রম মধ্যে এর ক্যাপচার করতে চান। দেখে মনে হচ্ছে সেড কমপক্ষে আমার ক্ষেত্রে এই শব্দার্থবিজ্ঞানগুলি অনুসরণ করে না।
মতান

9
perl -lne 'print if /Word A/ .. /Word D/' file

অথবা

cat file | perl -lne 'print if /Word A/ .. /Word D/'

1
ড্রাইভ বাই ডাউনভোটকে মোকাবেলা করতে +1। sedডিলিমিটিং লাইনগুলি নির্বাচন করার জন্য আপনার যদি পার্ল নিয়মিত এক্সপ্রেশনগুলির শক্তির প্রয়োজন না হয় তবে আমি এটির জন্য এখনও ব্যবহার করব ।
ট্রিপলি

70 এর দশকে যারা লোকে লিখেছেন তাদের অবশ্যই কৃতজ্ঞ হতে হবে :-)
মাতান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.