আমি কীভাবে কোনও ফাইলটিতে একাধিক প্যাটার্ন সন্ধান করতে পারি?


128

একটি নির্দিষ্ট স্ট্রিং প্যাটার্ন ধারণ করে এমন সমস্ত ফাইল আমার সন্ধান করা উচিত। প্রথম সমাধান মনে আসে ব্যবহার করছে খোঁজ সঙ্গে পাইপ xargs, grep :

find . -iname '*.py' | xargs grep -e 'YOUR_PATTERN'

তবে যদি আমার একাধিক লাইনে বিস্তৃত নিদর্শনগুলি সন্ধান করতে হয় তবে আমি আটকে আছি কারণ ভ্যানিলা গ্রেপ মাল্টলাইন প্যাটার্নগুলি খুঁজে পাচ্ছে না।



2
এটির বয়স্ক, তাই আমি বলব এটি কোনও সদৃশ নয় :)
রোজারডপ্যাক

@ আরগারডপ্যাক প্রশ্নগুলি সদৃশ হিসাবে চিহ্নিত করার সময়, প্রশ্নের উত্তর এবং পরিমাণ এবং প্রশ্নের মানের পরে একটি প্রশ্নের বয়স একটি তাত্পর্যপূর্ণ উদ্বেগ is
ট্রিপলি

উত্তর:


98

সুতরাং আমি প্যাকগ্রিপ আবিষ্কার করেছি যা পার্ল সামঞ্জস্যপূর্ণ নিয়মিত এক্সপ্রেশন জিআরইপি জন্য দাঁড়িয়েছে ।

উদাহরণস্বরূপ, যদি আপনি ফাইল যেখানে 'বের করতে হবে _name ' পরিবর্তনশীল immediatelly 'দ্বারা অনুসরণ করা হয় _description ' পরিবর্তনশীল:

find . -iname '*.py' | xargs pcregrep -M '_name.*\n.*_description'

টিপ: আপনার প্যাটার্নে আপনাকে লাইন ব্রেক চরিত্রটি অন্তর্ভুক্ত করতে হবে। আপনার প্ল্যাটফর্মের উপর নির্ভর করে এটি '\ n', \ r ',' \ r \ n ', ...


7
নীচে হালকা দ্বারা উল্লিখিত হিসাবে, "আপনি যদি নিজের নিয়মিত অভিব্যক্তিতে (? গুলি) যোগ করেন তবে আপনি ডট ওয়াইল্ডকার্ডকে নতুন লাইনের সাথে মেলাতে রাজিও করতে পারেন"। তারপরে -পি যুক্ত করে পার্ল রেজেেক্স সহ গ্রেপ ব্যবহার করুন। অনুসন্ধান . -Eexec গ্রেপ -nHP '(? গুলি) নির্বাচন করুন {1,60} থেকে। {1,20} টেবিলের নাম' '{}' \;
জিম

8
pcregrepম্যাকের সাথে পাওয়া যায়brew install pcre
জ্যারেড বেক

1
আরও ভাল করে: ব্যবহার -Hযা প্রতিটি ম্যাচের আগে ফাইলের নাম ছাপে: pcregrep -HM
সিরো সান্তিলি 郝海东 冠状 病 六四 事件 法轮功

97

আপনি কেন অবাক হয়ে যাবেন না :

awk '/Start pattern/,/End pattern/' filename

2
এটি বোঝার পক্ষে সহজ এবং ব্যবহারগুলি awkযা বেশিরভাগ * নিক্স সিস্টেমের সাথে আসে।
আলী কারবাসী

24
চমৎকার! এই ম্যাচটিকে লোভী করার কোনও উপায় আছে কি?
মার্সিন

3
কোনও মিল থাকলে আপনি কীভাবে ফাইলের নাম মুদ্রণ করবেন?
বিবস্থ

2
এর সাথে মিলগুলির লাইন নম্বরগুলি আপনি প্রদর্শন করতে পারেন awk '/Start pattern/,/End pattern/ {printf NR " "; print}' filename। আপনি এটা লাইন সংখ্যা একটি নির্দিষ্ট প্রস্থ দিয়ে prettier করতে পারেন: awk '/Start pattern/,/End pattern/ {printf "%-4s ", NR; print}' filename
রবার্ট

এটি একক ফাইলে খুব ভাল কাজ করছে বলে মনে হচ্ছে, তবে আমি যদি একাধিক ফাইলের মধ্যে অনুসন্ধান করতে চাই তবে কী হবে?
জিনস্ট্রং

84

জিএনইউgrep ব্যবহার করে উদাহরণটি এখানে :

grep -Pzo '_name.*\n.*_description'

-z/ --null-dataইনপুট এবং আউটপুট ডেটাগুলিকে লাইনের ক্রম হিসাবে গণ্য করে।

এখানেও দেখুন


1
আমি মনে করি এটি কেবল একটি নতুন লাইনের চরিত্রের জন্য অ্যাকাউন্ট।
মেঘ

1
আমি পতাকা ব্যবহার না করে মাল্টিলাইন অনুসন্ধানের জন্য গ্রেপ ব্যবহার করতে পারিনি, -zযাতে এটি একক লাইনে অনুসন্ধান বিভক্ত হয় না এবং -oকেবল মিলিত অংশ মুদ্রণ করে।
বিবাজা 42

আমি খুঁজে পেয়েছি যে -ও এটি কোনও কিছু প্রিন্ট না করার কারণ করেছে, তবে -l ফাইলগুলির একটি তালিকা পাওয়ার জন্য কাজ করেছিল (আমার কমান্ডটি ছিল grep -rzl pattern *, -রজো কাজ করেনি)
বেনুবার্ড ২

5
আমি নন-এএসসিআইআই ফাইলগুলির জন্য '' -pzo '' এর পরিবর্তে '' গ্রেপ -পাজো '' সুপারিশ করি । এটি আরও ভাল কারণ নন-এসসিআইআই ফাইলগুলিতে -z সুইচটি গ্রেপের "বাইনারি ডেটা" আচরণকে ট্রিগার করতে পারে যা প্রত্যাবর্তনের মানগুলিকে পরিবর্তন করে। সুইচ '' -এ | --text '' এটি প্রতিরোধ করে।
রবিবার

ইনস্টল করা গিট দিয়ে ম্যাকের সাথে কাজ করে নাbrew reinstall --with-pcre git
কোয়ানলং

21

grep -Pএছাড়াও libpcre ব্যবহার করে, তবে অনেক বেশি ইনস্টল করা। titleএইচটিএমএল ডকুমেন্টের একটি সম্পূর্ণ বিভাগ খুঁজে পেতে , এটি একাধিক লাইনের বিস্তৃত হলেও আপনি এটি ব্যবহার করতে পারেন:

grep -P '(?s)<title>.*</title>' example.html

যেহেতু পিসিআরই প্রকল্প পার্ল স্ট্যান্ডার্ডে প্রয়োগ করে, রেফারেন্সের জন্য পার্ল ডকুমেন্টেশন ব্যবহার করুন:


হুম ঠিক এখনই এটি চেষ্টা করেছে এবং দেখে মনে হচ্ছে না ... gist.github.com/rdp/0286d91624930bd11d0169d6a6337c33
রোজারডপ্যাক

আমি জানতাম না গ্রেপের এই বিকল্পটি ছিল। সম্ভবত এর কারণে: এটি অত্যন্ত পরীক্ষামূলক এবং গ্রেপ-পি অযৌক্তিক বৈশিষ্ট্যগুলি সম্পর্কে সতর্ক করতে পারে। ; এটি সেন্টোস under এর অধীনে F ফেডোরার ২৯ এর অধীনে: এটি পরীক্ষামূলক এবং গ্রেপ-পি অযৌক্তিক বৈশিষ্ট্যগুলির বিষয়ে সতর্ক করতে পারে । অবশ্যই বিএসডি গ্রেপ এ একেবারেই নেই। এটি এতটা পরীক্ষামূলক না হলে খুব ভাল লাগত তবে এটির স্মরণ করিয়ে দেওয়া খুব ভাল - তবে আমি এটি ব্যবহার করার সম্ভাবনা কম।
প্রাইফটান

17

এখানে আরও কার্যকর উদাহরণ:

pcregrep -Mi "<title>(.*\n){0,5}</title>" afile.html

এটি একটি এইচটিএমএল ফাইলে শিরোনাম ট্যাগটি সন্ধান করে এমনকি এটি 5 টি লাইন পর্যন্ত ছড়িয়ে পড়ে।

সীমাহীন লাইনের উদাহরণ এখানে:

pcregrep -Mi "(?s)<title>.*</title>" example.html 

4
এর জন্য ধন্যবাদ. ওয়াইল্ডকার্ড নতুন লাইনের চরিত্রের সাথে মেলে না তা বুঝতে পেরে আমি আটকে ছিলাম।
ম্যাট 15

7
@ ম্যাট: আপনি যদি (?s)নিজের নিয়মিত অভিব্যক্তিতে যোগ করেন তবে ডট ওয়াইল্ডকার্ডকে নতুন লাইনের সাথে মেলে ধরতেও রাজি করতে পারেন :"(?s)<html>.*</html>"
lubomir.brindza

@ ম্যাট অবশ্যই অবশ্যই $এটির রেখার সমাপ্তি বোঝাতে (কোনও প্যাটার্নের শেষে) জন্য পরীক্ষা করতে পারেন - যদিও এটি একাধিক লাইনের নিদর্শনগুলি খুঁজে পেতে আপনাকে সহায়তা করার মতো জিনিস নয়। এছাড়াও দেখুন glob(7)। আপনি এই আগ্রহের ওয়েবসাইটটিও পেতে পারেন: নিয়মিত- এক্সপ্রেশন.ইনফো
প্রাইফটান


4

আপনি এখানে গ্রেপ বিকল্প সিফ্ট ব্যবহার করতে পারেন (অস্বীকার: আমি লেখক)।

এটি মাল্টিলাইন মেলানো এবং বাক্সের বাইরে নির্দিষ্ট ফাইল ধরণের অনুসন্ধান সীমাবদ্ধ করে সমর্থন করে:

sift -m --files '* .py' 'YOUR_PATTERN'

(নির্দিষ্ট মাল্টলাইন রেজেক্স প্যাটার্নের জন্য সমস্ত * .py ফাইল অনুসন্ধান করুন)

এটি সমস্ত বড় অপারেটিং সিস্টেমের জন্য উপলব্ধ। একটি এক্সএমএল ফাইল থেকে মাল্টলাইন মানগুলি বের করতে কীভাবে এটি ব্যবহার করা যেতে পারে তা স্যাম্পল পৃষ্ঠাগুলি একবার দেখুন ।


3

এই উত্তরটি দরকারী হতে পারে:

বহু-লাইন অনুসন্ধানের জন্য রেজেেক্স (গ্রেপ)

পুনরাবৃত্তভাবে সন্ধান করতে আপনি পতাকাগুলি -আর (পুনরাবৃত্ত) এবং - অন্তর্ভুক্ত (জিএলওবি প্যাটার্ন) ব্যবহার করতে পারেন। দেখা:

কিছু ফাইলের মাধ্যমে গ্রেপ না করার জন্য সিনট্যাক্স অন্তর্ভুক্ত করে গ্রেপ - এক্সক্লুড / - ব্যবহার করুন


@ Ɖiamond ǤeezeƦ দয়া করে মনে রাখবেন LQP (একটি পোস্ট সম্পাদনা stackoverflow.com/review/low-quality-posts/19341146 ) পর্যালোচনা, তাই ঠিক সম্পাদন করা, অকার্যকর আপনি যদি নিশ্চিত বজায় রাখা পোস্ট চাহিদা আছে।
ফেডরকিই 'এসও ক্ষতিগ্রস্থ হওয়া বন্ধ করুন'

2

@ মার্সিন: অদ্ভুত উদাহরণ অ-লোভী:

awk '{if ($0 ~ /Start pattern/) {triggered=1;}if (triggered) {print; if ($0 ~ /End pattern/) { exit;}}}' filename


1

ex/ viসম্পাদক এবং গ্লোবস্টার বিকল্পটি ব্যবহার করে (এর মতো সিনট্যাক্স awkএবং এর মতো sed):

ex +"/string1/,/string3/p" -R -scq! file.txt

aaaআপনার প্রারম্ভিক বিন্দুটি কোথায় এবং bbbএটি আপনার শেষ পাঠ্য।

পুনরাবৃত্তি অনুসন্ধান করতে, চেষ্টা করুন:

ex +"/aaa/,/bbb/p" -scq! **/*.py

দ্রষ্টব্য: **বাক্য গঠন সক্ষম করতে , চালান shopt -s globstar(বাশ 4 বা zsh)।

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