গ্রেপ মাল্টলাইন প্যাটার্ন


13

আমি কীভাবে একাধিক লাইনে একটি বাক্যাংশ সন্ধান করব? উদাহরণস্বরূপ "আমার আইস টি" বাক্যাংশটি থাকতে দেয় তবে এটি পাঠ্য ফাইলগুলিতে আবৃত হতে পারে:

as js skdfh dfh djh sf my
ice tea.

এর মধ্যে একটি নতুন লাইন থাকায় গ্রেপ মিলবে না। এর সাথে আমি কীভাবে মিলব? আরেকটি মাল্টলাইন প্যাটার্ন হবেpattern1_\n_pattern2

আমি জানি আমি এটিএমের সবচেয়ে সহজ উপায়টি একটি অংশের জন্য কেবল গ্রেপ eg তবে এটি খুব ক্লান্তিকর। সুতরাং আপনি কীভাবে এটি সমাধান করবেন তা নিয়ে আমি ইন্টারেস্টেড।


1
এর সম্ভাব্য ক্রস সাইটের সদৃশ: স্ট্যাকওভারফ্লো.
com/ প্রশ্নগুলি / 152708/…

উত্তর:


16

আপনি ইনস্টল করতে পারেন pcregrep(বেশিরভাগ ডিস্ট্রো সংগ্রহস্থলগুলিতে উপলভ্য) - এটি পিসিআর লাইব্রেরি ব্যবহার করে গ্রেপ , যা "পার্ল সামঞ্জস্যপূর্ণ নিয়মিত এক্সপ্রেশন" করে। এটিতে একটি কমান্ড লাইন বিকল্প রয়েছে -Mযা আপনাকে ম্যান পৃষ্ঠা থেকে একাধিক লাইন অনুসন্ধান করতে দেয় :

"যে কোনও একটি ম্যাচের আউটপুটে একাধিক লাইন থাকতে পারে।"

সুতরাং আপনি করতে পারে

pcregrep -M 'my\s+ice\s+tea' filename

এটি \sহ'ল স্পেসস্পেস, যা মিলবে \nএবং \rমাল্টিলাইন মোডে, সাধারণ সাদা অংশের অক্ষর ছাড়াও। আপনি সরাসরি নিউলাইন চরিত্রটিও মেলাতে পারেন, তাই আপনি করতে পারেন

pcregrep -M 'pattern1_\n_pattern2' filename

+1 দুর্দান্ত। এটি কখনও শুনেনি, কিন্তু এটি চেষ্টা করে এবং এটি কবজির মতো কাজ করে!
ডেভপ্যারিলো

না grep -Epcre নিদর্শন কি?
দেনিথ

3
@Daenyth, grep -E বেশিরভাগই শুধু আপনি ব্যবহার করতে পারেন মানে ?, +, {, |, (, এবং )একটি আছে না করেও তাদের স্বাভাবিক Regex অর্থ \ সামনে, যেমন আপনি যদি মান, grep ব্যবহার করতে। সুতরাং grep 'hello\s\+world' fileসমতূল্য grep -E 'hello\s+world' file। এটি পিসিআরই করে না নেই grep -PPerl রেগুলার এক্সপ্রেশনের জন্য, কিন্তু এটা পরীক্ষামূলক (man পৃষ্ঠা অনুযায়ী) এবং আমি মনে করি এটা pcregrep থেকে একটু ভিন্ন ...
হামিশ ডোনার

1
হ্যাঁ, আমি -Pকখন বলেছিলাম সে সম্পর্কে ভাবছিলাম -E, তবে বুঝতে পারিনি এটি অন্যরকম।
দেনিথ

3

আমি সম্ভবত একটি অনুসন্ধান ব্যবহার করবেন vim'র :vimgrepকমান্ড। এটি অস্পষ্টভাবে এর মতো একটি পদ্ধতিতে কাজ করে grepতবে ভিম আরইএস এবং পাথগুলিকে সমর্থন করে।

মূলত আপনি :vimgrep 'pattern1\npattern2' path/**পুনরাবৃত্ত অনুসন্ধানের মতো কিছু চালান , তারপরে :copenম্যাচের একটি তালিকা সহ একটি ছোট উইন্ডো আনতে টাইপ করুন ।

vimআরইএস বেশিরভাগ পিসিআরআই যা করতে পারে তা করতে পারে তবে তারা পার্ল নিয়মিত প্রকাশের বংশ থেকে আলাদাভাবে বিকশিত হয়েছিল তাই বেশিরভাগ উন্নত স্টাফ আলাদাভাবে কাজ করে। তাদের মৌলিক কার্যকারিতাটি আরও বেশি বেসিক আরগুলির মতো, তবে তাদের কিছু নিফটি সংযোজন রয়েছে যা পিসিআরই প্রস্তাব করে না।

আমি নিশ্চিত না যে এটির মতো :vimgrepডেটাও ছিটানো সম্ভব কিনা grep; আমি এর মধ্যে নেভিগেশনের জন্য কেবল এটি ব্যবহার করার চেষ্টা করেছি vim

:help vimgrepvimআরও তথ্যের জন্য ভিতরে থেকে ; আরইএস সম্পর্কিত :help pattern.txtতথ্যের জন্য vim; পাথের আরও তথ্যের জন্য দেখুন :help wildcards


সতর্কতা অবলম্বন করুন - এটি সম্পূর্ণরূপে বহনযোগ্য নয় কারণ এটি বিভিন্ন প্ল্যাটফর্মগুলিতে আলাদা আচরণ করবে
দেনিথ

1
@ ডেইনথ: আপনার অর্থ কি বিভিন্নের প্রভাবে .vimrc? grepঅপারেটিং সিস্টেমের তুলনায় এটি আরও পোর্টেবল হওয়া উচিত : vim"পসিক্স ফ্লেভার" নেই এবং উইন্ডোজের অধীনে কম-বেশি অভিন্নভাবে কাজ করে। .................................................. ........................... এটি নিশ্চিত করতে কোয়ালিফায়ার যুক্ত করা সম্ভব যে যেমন "ম্যাজিক" এর সঠিক পরিমাণটি আরই-তে ব্যবহৃত হয়, যদিও যেহেতু আমি এটি বুঝতে পেরেছি সেই বিকল্পটি হ্যাককে একা ছেড়ে চলে যাওয়ার জন্য কঠোর অলিখিত লিখিত নিয়ম রয়েছে।
intuited

আমি নিজে এটি ব্যবহার করি নি, তবে এটিকে উইন্ডোতে ( find.exeপরিবর্তে grep) আলাদা ব্যাকএন্ড ব্যবহার করা হয়েছে । গত কয়েক সপ্তাহের মধ্যে আরও একটি প্রশ্ন ছিল যেটিতে এটি ছিল।
দেনিথ

1
@ ডেইনথ: আপনি :vimgrepনাকি ভাবছেন :grep? থেকে :help grep: "অভ্যন্তরীণ গ্রেপ [অর্থাৎ :vimgrep] এর সুবিধাটি হ'ল এটি সমস্ত সিস্টেমে কাজ করে এবং শক্তিশালী ভিম অনুসন্ধান নিদর্শনগুলি ব্যবহার করে" "
intuited

1
আহ, এটা হতে হবে। আমি দুজনকে গুলিয়ে ফেললাম।
দেনিথ

2

গ্রেপ একবারে কেবল একটি লাইনে কাজ করে তবে আপনি প্যাটার্নের সীমার সাথে মেলে লাইনগুলি মুদ্রণের জন্য awk ব্যবহার করতে পারেন:

cat file | awk '/foo/,/bar/'

এটি দুটি প্যাটার্নের মধ্যে কেবল নতুন লাইনের সাথে নয়, কোনও কিছুতেই মিলবে


0

ইউনিক্স থেকে সর্বাধিক উপকার পেতে আপনার পাইপের সুবিধা নিতে হবে। আপনি grepপাইপগুলি ব্যবহার করে এটি সরলভাবে করতে পারেন (টি-র প্রয়োজন নেই):

$ grep -A1 "pattern1" file.txt |  grep "pattern2"

যা আমি ক্লান্তিকর বিবেচনা করব না।


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