আমি একাধিক লাইনে একাধিক নিদর্শনগুলির জন্য গ্রেপ করব কীভাবে?


19

সম্পর্ন নিভূল হতে পারে

Some text
begin
Some text goes here.
end
Some more text

এবং আমি "ব্লক" থেকে "শেষ" অবধি শুরু হওয়া পুরো ব্লকটি বের করতে চাই।

awk দিয়ে আমরা পছন্দ করতে পারি awk '/begin/,/end/' text

গ্রেপ দিয়ে কীভাবে করবেন?


উত্তর:


14

18-নভেম্বর -2016 আপডেট হয়েছে (যেহেতু গ্রেপ আচরণটি পরিবর্তিত হয়েছে: -পি প্যারামিটার সহ গ্রেপ এখন সমর্থন করে না ^এবং $অ্যাঙ্করগুলি [কর্নেল v: 4.4.0-21-জেনেরিক সহ] উবার্টু 16.04-এ)) ( ভুল (অ-) সমাধান )

$ grep -Pzo "begin(.|\n)*\nend" file
begin
Some text goes here.  
end

দ্রষ্টব্য: অন্যান্য কমান্ডের জন্য কেবল '^' & '$' অ্যাঙ্কারগুলিকে নতুন লাইন অ্যাঙ্কর প্রতিস্থাপন করুন '\n' ______________________________

গ্রেপ কমান্ড সহ:

grep -Pzo "^begin\$(.|\n)*^end$" file

আপনি যদি ফলাফলগুলি "শুরু" এবং "শেষ" অন্তর্ভুক্ত না করতে চান তবে লিকহাইন্ড এবং লিকহেড সমর্থন সহ গ্রেপ ব্যবহার করুন।

grep -Pzo "(?<=^begin$\n)(.|\n)*(?=\n^end$)" file

এছাড়াও আপনি \Kলুকহাইন্ড দৃ as়তার পরিবর্তে বিজ্ঞপ্তিটি ব্যবহার করতে পারেন ।

grep -Pzo "^begin$\n\K(.|\n)*(?=\n^end$)" file

\Kপ্যাটার্ন মেলানোর আগে বিকল্পটি সবকিছু উপেক্ষা করুন এবং প্যাটার্ন নিজেই উপেক্ষা করুন।
\nআউটপুট থেকে খালি লাইন মুদ্রণ এড়ানোর জন্য ব্যবহৃত।

অথবা @ অভিনশরাজের পরামর্শ অনুসারে নীচে সহজ সরল গ্রেপ রয়েছে:

grep -Pzo "(?s)^begin$.*?^end$" file

grep -Pzo "^begin\$[\s\S]*?^end$" file

(?s)গ্রেটকে বিন্দুটিকে নতুন লাইনের অক্ষরের সাথে মেলে দেওয়ার অনুমতি দেয়।
[\s\S]হোয়াইটস্পেস বা অ-সাদা স্থানের কোনও অক্ষরের সাথে মেলে।

এবং "আউট" এবং "শেষ" অন্তর্ভুক্ত না করে তাদের আউটপুট নীচে রয়েছে:

grep -Pzo "^begin$\n\K[\s\S]*?(?=\n^end$)" file # or grep -Pzo "(?<=^begin$\n)[\s\S]*?(?=\n^end$)"

grep -Pzo "(?s)(?<=^begin$\n).*?(?=\n^end$)" file

এখানে সমস্ত কমান্ডের সম্পূর্ণ পরীক্ষা দেখুন ( -পি প্যারামিটারের সাথে গ্রেপ আচরণ পরিবর্তিত হয়েছে )

বিঃদ্রঃ:

^একটি রেখার সূচনা করুন এবং একটি লাইনের $প্রান্তটি নির্দেশ করুন। এগুলি "সূচনা" এবং "শেষ" এর চারপাশে যুক্ত হয়েছে যদি তারা কোনও লাইনে একা থাকে তবে তাদের সাথে মেলে।
দুটি কমান্ডে আমি পালিয়ে গিয়েছিলাম $কারণ এটি "কমান্ড সাবস্টিটিউশন" ( $(command)) ব্যবহার করে যা একটি কমান্ডের আউটপুটকে কমান্ডের নাম প্রতিস্থাপন করতে দেয়।

ম্যান গ্রেপ থেকে:

-o, --only-matching
      Print only the matched (non-empty) parts of a matching line,
      with each such part on a separate output line.

-P, --perl-regexp
      Interpret PATTERN as a Perl compatible regular expression (PCRE)

-z, --null-data
      Treat the input as a set of lines, each terminated by a zero byte (the ASCII 
      NUL character) instead of a newline. Like the -Z or --null option, this option 
      can be used with commands like sort -z to process arbitrary file names.

আপনার গ্রেপ পরিবর্তন শুরু করুন লাইনে উপস্থিত অক্ষর grep -Pzo "(?<=begin\n)(.|\n)*(?=\nend)" fileমুদ্রণ না করতে চান \n
অবিনাশ রাজ

এমনকি নিউলাইন চরগুলিও মেলে তুলতে বিন্দু তৈরি করতে ডটল সংশোধক ব্যবহার করুনgrep -Pzo "(?s)begin.*?end" file
অবিনাশ রাজ

বা সরলভাবে,grep -Pzo "begin[\s\S]*?end" file
অবিনাশ রাজ

1
সিলেশন কাজ করে না। এটি একটি ত্রুটি তৈরি করে: grep: ein nicht geschütztes ^ oder $ wird mit -Pz nicht unterstütztত্রুটির grep: a not protected ^ or $ is not supported with -Pz
অনুবাদটি হ'ল

1
হ্যাঁ, আমি জানি, এটি আপনার উত্তরে। আমি নিশ্চিত আপনি এটি পোস্ট করার সময় এটি কার্যকর হয়েছিল তবে আজ আবার চেষ্টা করুন। এর আচরণ grepবদলে গেছে বলে মনে হচ্ছে।
টেরডন

2

যদি আপনার grepপার্ল সিনট্যাক্স ( -P) সমর্থন করে না , আপনি লাইনগুলিতে যোগদানের চেষ্টা করতে পারেন, প্যাটার্নটির সাথে মিল রেখে, আবার নীচের মতো আবার লাইনগুলি প্রসারিত করতে পারেন:

$ tr '\n' , < foo.txt | grep -o "begin.*end" | tr , '\n'
begin
Some text goes here.
end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.