ফাইল / ইনপুটগুলিতে স্ট্রিং প্যাটার্ন সন্ধান করুন, প্রসঙ্গে নির্ভরশীল অনুসন্ধান করুন (গ্রেপের মতো নয়)


3

grep(লিনাক্স) বা findstr(ডস) এর মতো পাঠ্য সন্ধান করার জন্য কি কোনও ইউটিলিটি পাওয়া যায় তবে অন্য প্রদত্ত পাঠ / প্যাটার্নটি খুঁজে পাওয়ার পরে কেবল অনুসন্ধান শুরু করতে পারে?

কোনও ফাইলটিতে প্রদত্ত পাঠ্য / প্যাটার্নটি সন্ধান করার মতো, তবে কেবলমাত্র সেই ফাইলের নির্দিষ্ট অংশের ভিতরে। আমার ক্ষেত্রে কেবলমাত্র 'ফাইল' হ'ল অন্য প্রোগ্রামের আউটপুট এবং আউটপুট করা রেখাগুলির পরিমাণ কোনও ফাইলে লিখতে এবং সেখানে বিশ্লেষণ করার জন্য অনেক বেশি।

উদাহরণ:

section ONE
  text_a
  text_b
  text_c
section TWO
  text_b
  text_c
section THREE
  . . .

কেবলমাত্র বিভাগ দুইটিতে "পাঠ্য_সি" রয়েছে কিনা তা সন্ধান করুন।

আমি grepএর বিকল্পগুলি পড়ার চেষ্টা করেছি তবে মনে হয় এই ক্ষমতা নেই have এটি "টেক্সট_সি" বিভাগের নামের চেয়ে দীর্ঘতর হওয়ার কারণে স্ট্রিং তুলনার পরিমাণও হ্রাস করবে বলে আশা করা হচ্ছে।

উত্তর:


2

আসুন এই পরীক্ষা ফাইলটি বিবেচনা করুন:

$ cat file
section ONE
  text_a
  text_b
  text_c  <-ignore this
section TWO
  text_b
  text_c  <-keep this
section THREE
  text_a
  text_b
  text_c  <-ignore this

এতে থাকা text_cযে কোনও লাইন নির্বাচন করতে section TWO:

$ awk '/^section/{f=0} /^section TWO/{f=1} f && /text_c/' file
  text_c  <-keep this

যদি ইনপুটটি কোনও ফাইল থেকে নয় তবে থেকে উত্পন্ন হয় commandতবে ব্যবহার করুন:

command | awk '/^section/{f=0} /^section TWO/{f=1} f && /text_c/'

কিভাবে এটা কাজ করে

  • /^section/{f=0}

    যে কোনও সময় আমরা একটি রেখা পাই section, সেট দিয়ে শুরু করি f=0

  • /^section TWO/{f=1}

    যদি লাইনটি শুরু হয় section TWO, তবে পূর্ববর্তী কমান্ডটি ওভাররাইড করুন এবং সেট করুন f=1

  • f && /text_c/

    যদি fননজারো হয় এবং বর্তমান লাইনটি মিলে যায় text_cতবে লাইনটি মুদ্রণ করুন।


গ্রেট! এখন আমাকে উইন্ডোজ / ডস সমতুল্য সন্ধান করতে হবে , যেহেতু কখনও কখনও উইন্ডোজ নির্দিষ্ট ব্যাচ ফাইল এবং সাইগউইন (আমার ক্ষেত্রে বাবুন) থেকে আউটপুট আসে ঠিক একই আউটপুট দেয় না ...
সনি

খুব ভালো. ডস / উইন্ডোজ ইস্যুগুলির ক্ষেত্রে, আপনার বিবরণে নির্দিষ্টতার অভাব রয়েছে তবে তাদের বেশিরভাগ ক্ষেত্রে একটি পছন্দ dos2unixমতো ইউটিলিটি দিয়ে সমাধান করা যেতে পারে যা ক্যারেজ রিটার্নের অক্ষরগুলি সরিয়ে ফেলবে।
1024

আমার ধারণা রেজিজ পরিবর্তন করে লাইন এন্ডিংগুলি পরিচালনা করা যায়, যদি এটি সমস্যার কারণ হয়। তবে আমার অর্থ হ'ল ... কেবলমাত্র সাইগউইন (বাবুন) এ একটি ব্যাচ ফাইল চালানোর চেষ্টা করা হয়েছিল এবং কিছু কমান্ড আউটপুটে অদ্ভুত উপসর্গ পেয়ে %{)g[blue]%}{ %c }যায় : ... যা @echo offপ্রথম পংক্তির সাথে চলে যায় যদিও (অন্য কোনও কিছুর গণ্ডগোল হয়েছে কিনা তা পরিষ্কার নয়) ।
সনি

আমার অজ্ঞতাটি ক্ষমা করুন, তবে কেউ কি কখনও উইন / ডসের জন্য দরকারী কোন লিনাক্স ইউটিলিটি সংকলনের চেষ্টা করেছেন? এগুলি কি সরল সি-তে লেখা নেই?
sny

1
ব্যাচ ফাইল ইস্যু নিয়ে আমার কোনও অভিজ্ঞতা নেই। উইনকে পোর্ট করা ইউনিক্স ইউটিলিটির বিভিন্ন সংগ্রহ রয়েছে। GnuWin32 / GnuWin64 এর একটি উদাহরণ ছিল।
1024

2

আপনি এটির মতো করেও এটি করতে sedপারেন:

command | sed -n -e '/section TWO/,/section THREE/ { /text_c/p;}'

এটি এর দ্বারা কাজ করে:

  • -nsedডিফল্ট অনুসারে ম্যাচিং লাইনগুলি প্রিন্ট না করতে বলে
  • -esedকাজ করার জন্য একটি স্ক্রিপ্ট দেয়
    • /section TWO/,/section THREE/আমাদের ঠিকানা পরিসর নির্ধারণ, তাই আমরা লাইন মেলে মধ্যে সব লাইন পাশে ফাংশন প্রয়োগ করতে যাচ্ছি section TWOএবংsection THREE
    • { /text_c/p;}ফাংশনটি সংজ্ঞায়িত করে যা একটি লাইনের সাথে মিলবে text_cএবং যদি এটি খুঁজে পায় তবে এটি pমুদ্রণ করবে

ধন্যবাদ, জানা ভাল। যদিও আমার মামলার জন্য কার্যকর নয়। আমার কাছে সমস্ত "বিভাগ" নাম নেই, কেবল আগ্রহী ones ভোট দিন! (বাস্তবে এটি করার জন্য যথেষ্ট খ্যাতি পয়েন্ট এখনও নেই)
সনি

বিভাগের আদেশটি জানা থাকলে, এটি একটি ভাল পদ্ধতির হবে। সুতরাং, স্নি যেমন করতে চেয়েছিল: +1।
1024

1

প্রতিটি বিভাগ অনুসরণ করে এমন রেখার সংখ্যা যদি কিছুটা ধ্রুব থাকে তবে বিভাগের ম্যাচের পরে এক্স লাইনগুলি প্রিন্ট করতে আপনি গ্রেপ-তে '-A x ' বিকল্পটি ব্যবহার করতে পারেন । এরপরে এটি একটি দ্বিতীয় গ্রেপ-এ পাইপ করা যেতে পারে যা 'বিভাগে দু'টি বিভাগে আপনার প্যাটার্নটি দেখায়।

$ cat file
section ONE
  1 text_a
  1 text_b
  1 text_c  
section TWO
  2_text_a
  2 text_b
  2 text_c  
section THREE
  3 text_a
  3 text_b
  3 text_c 

$ grep -A3 'section TWO' file | grep text_c
  2 text_c

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