"ফু" ধারণ করে এমন রেখাগুলির জন্য আমি কীভাবে একটি ডিরেক্টরি গ্রেপ করতে পারি , তবে পরের লাইনে "বার" থাকা অবস্থায় কেবল মিল পাওয়া যায়?
"ফু" ধারণ করে এমন রেখাগুলির জন্য আমি কীভাবে একটি ডিরেক্টরি গ্রেপ করতে পারি , তবে পরের লাইনে "বার" থাকা অবস্থায় কেবল মিল পাওয়া যায়?
উত্তর:
@ warl0ck আমাকে সঠিক দিকটির দিকে নির্দেশ করেছেন pcregrep
তবে আমি বলেছিলাম "রয়েছে", "নয়" এবং আমি একটি ডিরেক্টরি নয়, একটি ডিরেক্টরি সম্পর্কে জিজ্ঞাসা করেছি।
এটি আমার পক্ষে কাজ করে বলে মনে হচ্ছে।
pcregrep -rMi 'Foo(.*)\n(.*)Bar' .
গ্রেপ নিজেই এটি সমর্থন করে বলে মনে হয় না, পরিবর্তে পিসিগ্রিপ ব্যবহার করুন:
Foo
Bar
Foo
abc
pcregrep -M "Foo\nBar" file
পেয়েছেন:
Foo
Bar
Foo
এবং Bar
পুরো লাইনটি তৈরি করবে।
একটি 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
মানে কি ? অনেক আগ্রহব্যাঞ্জক.
pattern space
& hold space
: grymoire.com/Unix/Sed.html#uh-56 বা ফরাসি মধ্যে commentcamarche.net/faq/9536-sed-introduction-a-sed-part-i
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'
যদিও আমি নাথানের সমাধান ব্যবহার করে পছন্দ করি pcregrep
, এখানে কেবল গ্রেপ ব্যবহার করে সমাধান দেওয়া হচ্ছে
grep -o -z -P 'Foo(.*)\n(.*)Bar' file
বিকল্প ব্যাখ্যা:
-o
শুধুমাত্র মেলে অংশ মুদ্রণ। অন্তর্ভুক্তি থেকে প্রয়োজনীয় -z
সমস্ত ফাইল মুদ্রণ করবে (কোথাও \ 0 না থাকলে)-z
ইনপুটটিকে লাইনের একটি সেট হিসাবে গণ্য করুন, প্রতিটিই একটি নতুন লাইনের পরিবর্তে শূন্য বাইট (ASCII NUL অক্ষর) দ্বারা সমাপ্ত।-P
পার্ল রেজেক্স সিনট্যাক্স সম্পাদনা: এই সংস্করণটি সম্পূর্ণ মিলিত লাইনগুলি মুদ্রণ করে
grep -o -P -z '(.*)Foo(.*)\n(.*)Bar(.*)' file
-z
। কিছু "(। *)" পুরো এক্সপ্রেশনটির আগে এবং পরে এটি সম্পূর্ণ মিলিত লাইনের আউটপুট তৈরি করে। আপাতত "Foo" এর আগে এবং "বার" এর পরে সাবস্ট্রিংগুলি প্রদর্শিত হয় না।
জোর দিয়ে:
awk '/bar/ && prev != "" {print FILENAME ": " prev "\n" FILENAME ": " $0}
/foo/ {prev=$0; next}
{prev=""}' file1...
(বিশ্রী সীমাবদ্ধতা সম্পর্কে সাধারণ দ্রষ্টব্য: সাবধানতা অবলম্বন করুন যে কোনও ফাইলের নামগুলিতে "=" অক্ষর থাকতে পারে তবে আপনাকে এটিকে উত্তোলনের ./filename
পরিবর্তে পাস করতে হবে filename
)