দুটি ধারাবাহিক লাইনের সামগ্রীর উপর ভিত্তি করে আমি কীভাবে একটি ডিরেক্টরি গ্রেপ করতে পারি?


11

"ফু" ধারণ করে এমন রেখাগুলির জন্য আমি কীভাবে একটি ডিরেক্টরি গ্রেপ করতে পারি , তবে পরের লাইনে "বার" থাকা অবস্থায় কেবল মিল পাওয়া যায়?


সমস্যাটি এখন আসলটির থেকে সম্পূর্ণ পৃথক: / পুরানো সংস্করণগুলিকে রিভার্ট করা আরও ভাল হতে পারে এবং অন্য একটি পোস্ট করতে পারে? তবুও নতুন প্রশ্নটি আমার পক্ষে পরিষ্কার নয়।
গিলস কুইনট

@ স্পটনিক - কীভাবে? আমি প্রথম প্রশ্ন পোস্ট করার সময় একটি ডিরেক্টরি নির্দিষ্ট করেছিলাম; আমি কেবল এটি গাed় করেছিলাম কারণ লোকেরা নজর দিচ্ছিল না।
নাথান লং

কিছুই নয়, এটি কাজ করবে, আমি সেই অনুযায়ী আমার পোস্ট সম্পাদনা করব।
গিলস কুইনট

উত্তর:


7

@ warl0ck আমাকে সঠিক দিকটির দিকে নির্দেশ করেছেন pcregrepতবে আমি বলেছিলাম "রয়েছে", "নয়" এবং আমি একটি ডিরেক্টরি নয়, একটি ডিরেক্টরি সম্পর্কে জিজ্ঞাসা করেছি।

এটি আমার পক্ষে কাজ করে বলে মনে হচ্ছে।

pcregrep -rMi 'Foo(.*)\n(.*)Bar' .

6

গ্রেপ নিজেই এটি সমর্থন করে বলে মনে হয় না, পরিবর্তে পিসিগ্রিপ ব্যবহার করুন:

Foo
Bar
Foo
abc

pcregrep -M "Foo\nBar" file

পেয়েছেন:

Foo
Bar

3
ওপি এটি বলে নি Fooএবং Barপুরো লাইনটি তৈরি করবে।
tojrobinson

6

একটি sedস্ক্রিপ্ট সহ:

#!/bin/sed -nf

/^Foo/{
    h         # put the matching line in the hold buffer
    n         # going to nextline
    /^Bar/{   # matching pattern in newline
        H     # add the line to the hold buffer
        x     # return the entire paragraph into the pattern space
        p     # print the pattern space
        q     # quit the script now
    }
}

এটি ব্যবহার করতে:

chmod +x script.sed
printf '%s\n' * | ./script.sed

printfএখানে এক লাইন প্রতিটি বর্তমান ডিরেক্টরির মধ্যে সমস্ত ফাইল প্রদর্শন, এবং এটি পাস sed

দ্রষ্টব্য : এটি বর্ণমালা অনুসারে বাছাই করা হয়েছে

দরকারী pattern spaceএবং hold space এখানে আরও infos ।

grymoire.comshell প্রোগ্রামিং সম্পর্কে সত্যিই ভাল জিনিস আছে ।


h, n, H, x, p, qমানে কি ? অনেক আগ্রহব্যাঞ্জক.
ইয়ামেনেকো

আমার মন্তব্য দেখুন। আরো infos pattern space& hold space: grymoire.com/Unix/Sed.html#uh-56 বা ফরাসি মধ্যে commentcamarche.net/faq/9536-sed-introduction-a-sed-part-i
গিলেজ Quenot

পোষ্ট একটি ডিরেক্টরিতে কাজ করার জন্য অভিযোজিত
গিলস কুইনট

4

grepশুধুমাত্র ব্যবহার করে , আপনি নিম্নলিখিত পাইপটি নির্মাণ করতে পারেন:

grep -A1 'Foo' input_file | grep -B1 'Bar' | grep 'Foo'

প্রথমটি ম্যাচের পরে grepসমস্ত রেখাগুলির Fooপাশাপাশি লাইনটি পাবে। তারপরে আমরা Barম্যাচের আগে লাইনগুলির পাশাপাশি লাইনগুলি পাই এবং শেষ পর্যন্ত এই আউটপুট থেকে লাইনগুলি বের করি Foo

সম্পাদনা: ম্যানট ওয়ার্ক হিসাবে উল্লেখ করা হয়েছে, কিছু সমস্যাযুক্ত বিষয় পর্যবেক্ষণ করতে হবে। যদিও একটি আকর্ষণীয় চ্যালেঞ্জ, grepএর লাইন ওরিয়েন্টেড কার্যকারিতার কারণে, এর সাথে যে কোনও সমাধান সম্ভবত 'হ্যাক' হওয়ার সম্ভাবনা রয়েছে এবং আপনি সম্ভবত এমন কিছু ব্যবহার করা থেকে ভাল pcregrepযা হাতের কাজটির সাথে আরও উপযুক্ত।


খুশী হলাম। আমি যদিও একটি ডিরেক্টরি সম্পর্কে জিজ্ঞাসা করেছি; এটি কাজ করছে বলে মনে হচ্ছে:find . -name '*.txt' | xargs grep -A1 'Foo' | grep -B1 'Bar'
নাথান লং

এটি একই লাইনে "ফু" এবং "বার" উভয়ের সাথে ঘটনাগুলিও তালিকাভুক্ত করবে।
manatwork

@ মান্যাটওয়ার্ক: "ফু" এবং "বার" ধারণ করে এমন রেখাগুলি "লু যা" ফু "অন্তর্ভুক্ত করে যা জিজ্ঞাসা করা হয়েছিল।
tojrobinson

1
@ টজ্রোবিনসন, পরের লাইনে "বার" "অংশ থাকা অবস্থায় কেবল তবে ম্যাচগুলি কী হবে? পেস্টবিন.
com

3

যদিও আমি নাথানের সমাধান ব্যবহার করে পছন্দ করি pcregrep, এখানে কেবল গ্রেপ ব্যবহার করে সমাধান দেওয়া হচ্ছে

grep -o -z -P  'Foo(.*)\n(.*)Bar' file

বিকল্প ব্যাখ্যা:

  • -oশুধুমাত্র মেলে অংশ মুদ্রণ। অন্তর্ভুক্তি থেকে প্রয়োজনীয় -zসমস্ত ফাইল মুদ্রণ করবে (কোথাও \ 0 না থাকলে)
  • -z ইনপুটটিকে লাইনের একটি সেট হিসাবে গণ্য করুন, প্রতিটিই একটি নতুন লাইনের পরিবর্তে শূন্য বাইট (ASCII NUL অক্ষর) দ্বারা সমাপ্ত।
  • -P পার্ল রেজেক্স সিনট্যাক্স

সম্পাদনা: এই সংস্করণটি সম্পূর্ণ মিলিত লাইনগুলি মুদ্রণ করে

    grep -o -P -z  '(.*)Foo(.*)\n(.*)Bar(.*)' file

1
কুল ট্রিক কি -z। কিছু "(। *)" পুরো এক্সপ্রেশনটির আগে এবং পরে এটি সম্পূর্ণ মিলিত লাইনের আউটপুট তৈরি করে। আপাতত "Foo" এর আগে এবং "বার" এর পরে সাবস্ট্রিংগুলি প্রদর্শিত হয় না।
manatwork

1

জোর দিয়ে:

awk '/bar/ && prev != "" {print FILENAME ": " prev "\n" FILENAME ": " $0}
     /foo/ {prev=$0; next}
     {prev=""}' file1...

(বিশ্রী সীমাবদ্ধতা সম্পর্কে সাধারণ দ্রষ্টব্য: সাবধানতা অবলম্বন করুন যে কোনও ফাইলের নামগুলিতে "=" অক্ষর থাকতে পারে তবে আপনাকে এটিকে উত্তোলনের ./filenameপরিবর্তে পাস করতে হবে filename)

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