গ্রেপ ব্যবহার করে একাধিক লাইন জুড়ে নিদর্শনগুলি কীভাবে খুঁজে পাবেন?


208

আমি সেই ক্রমে "abc" এবং "efg" থাকা ফাইলগুলি সন্ধান করতে চাই এবং সেই দুটি স্ট্রিং সেই ফাইলের বিভিন্ন লাইনে রয়েছে। যেমন: সামগ্রী সহ একটি ফাইল:

blah blah..
blah blah..
blah abc blah
blah blah..
blah blah..
blah blah..
blah efg blah blah
blah blah..
blah blah..

ম্যাচ করা উচিত।


উত্তর:


225

এই ক্রিয়াকলাপের জন্য গ্রেপ যথেষ্ট নয়।

pcregrep যা আধুনিক লিনাক্স সিস্টেমের বেশিরভাগ ক্ষেত্রে পাওয়া যায় তা ব্যবহার করা যায়

pcregrep -M  'abc.*(\n|.)*efg' test.txt

যেখানে -M, --multiline নিদর্শনগুলিকে একাধিক লাইনের সাথে মেলানোর অনুমতি দিন

একটি নতুন pcre2grep এছাড়াও আছে। উভয়ই পিসিআরই প্রকল্প দ্বারা সরবরাহ করা হয় ।

pcre2grep পোর্টের অংশ হিসাবে ম্যাক পোর্টগুলির মাধ্যমে ম্যাক ওএস এক্স এর জন্য উপলব্ধ pcre2:

% sudo port install pcre2 

এবং হোমব্রিউয়ের মাধ্যমে এটি:

% brew install pcre

বা pcre2 এর জন্য

% brew install pcre2

pcre2grep লিনাক্সেও পাওয়া যায় (উবুন্টু 18.04+)

$ sudo apt install pcre2-utils # PCRE2
$ sudo apt install pcregrep    # Older PCRE

11
@ স্টেভেনলু -M, --multiline- নিদর্শনগুলিকে একাধিক লাইনের সাথে মেলানোর অনুমতি দিন।
রিং বাহক

7
এটি দ্রষ্টব্য। * (\ N |।) * (\ N |।) * এর সমান এবং দ্বিতীয়টি সংক্ষিপ্ত। এছাড়াও আমার সিস্টেমে, "pcre_exec () ত্রুটি -8" ঘটে যখন আমি দীর্ঘ সংস্করণটি চালাই run সুতরাং পরিবর্তে 'abc (| n |।) * Efg' চেষ্টা করে দেখুন!
daveagp

6
সেক্ষেত্রে আপনাকে ভাব প্রকাশকে অ-লোভী করা দরকার:'abc.*(\n|.)*?efg'
রিং বাহক

4
এবং আপনি প্রথমটি বাদ দিতে পারেন .*-> 'abc(\n|.)*?efg'রেগেক্সকে আরও ছোট করতে (এবং পেডেন্টিক হতে)
মিশি

6
pcregrepজিনিসগুলিকে সহজ করে তোলে, তবে grepকাজ করবে। উদাহরণস্বরূপ, stackoverflow.com/a/7167115/123695 দেখুন
মাইকেল মায়ার

113

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

sed -e '/abc/,/efg/!d' [file-with-content]

4
এটি ফাইলগুলি খুঁজে পায় না, এটি একটি একক ফাইল থেকে মিলের অংশটি ফেরত দেয়
shiggity

11
@Lj। দয়া করে আপনি এই আদেশটি ব্যাখ্যা করতে পারেন? আমি এর সাথে পরিচিত sed, তবে যদি এর আগে এর আগে কখনও এমন অভিব্যক্তি না দেখি।
অ্যান্টনি

1
@ অ্যান্টনি, এটি ঠিকানার ম্যান পেজে নথিবদ্ধ, ঠিকানার অধীনে। এটি বুঝতে গুরুত্বপূর্ণ যে / abc / & / efg / একটি ঠিকানা।
স্কুইডলি

49
আমি সন্দেহ করি যে এই উত্তরটি আরও কিছুটা ব্যাখ্যা থাকলে এটি সহায়ক হত that সেক্ষেত্রে আমি আরও একবার এটির ভোট দিয়েছি। আমি খানিকটা শেড জানি, তবে বিড়ালের আধ ঘন্টা পরে অর্থবহ প্রস্থান কোড তৈরি করতে এই উত্তরটি ব্যবহার করা যথেষ্ট নয়। টিপ: 'আরটিএফএম' স্ট্যাকওভারফ্লোতে খুব কমই আপ-ভোট পায়, যেমনটি আপনার আগের মন্তব্যে দেখা গেছে।
মাইকেল শ্যাপার

25
উদাহরণস্বরূপ দ্রুত ব্যাখ্যা: সেড '1,5 ডি': 1 এবং 5 এর মধ্যে লাইনগুলি মুছুন '1,5! D': 1 এবং 5 এর মধ্যে নয় লাইনগুলি মুছুন (অর্থাত্ লাইনগুলি মাঝখানে রাখুন) তবে একটি সংখ্যার পরিবর্তে, আপনি পারেন / প্যাটার্ন / দিয়ে একটি লাইন অনুসন্ধান করুন। নীচের সরলতমটি আরও দেখুন: সেড-এন '/ এবিসি /, / ইফজি / পি' পি প্রিন্টের জন্য এবং
-ন

86

এই উত্তর দ্বারা অনুপ্রাণিত একটি সমাধান এখানে :

  • যদি 'abc' এবং 'efg' একই লাইনে থাকতে পারে:

    grep -zl 'abc.*efg' <your list of files>
  • যদি 'abc' এবং 'efg' অবশ্যই আলাদা লাইনে থাকে:

    grep -Pzl '(?s)abc.*\n.*efg' <your list of files>

প্যারাম:

  • -zইনপুটটিকে লাইনগুলির সেট হিসাবে বিবেচনা করুন, প্রতিটি একটি নতুন লাইনের পরিবর্তে শূন্য বাইট দ্বারা সমাপ্ত। অর্থ্যাৎ গ্রেপ ইনপুটটিকে একটি বড় লাইন হিসাবে গণ্য করে।

  • -l প্রতিটি ইনপুট ফাইলের মুদ্রণের নাম যা থেকে আউটপুট সাধারণত মুদ্রিত হত।

  • (?s)PCRE_DOTALL সক্রিয় করুন, যার অর্থ ''। যে কোনও চরিত্র বা নিউলাইন সন্ধান করে।


@ সাইন্ট্যাক্সারর নং, আমি মনে করি এটি কেবল একটি ছোট-বড় ঘটনা l। এএআইএইএইইইসিপি'র কোনও সংখ্যা নেই -1
স্পারহাক

দেখে মনে হচ্ছে আপনি ঠিক আছেন, পরীক্ষার সময় আমি টাইপও করেছিলাম। যে কোনও ক্ষেত্রে একটি মিথ্যা ট্রেইল রাখার জন্য দুঃখিত।
সিন্টাক্সেরোর

6
এটি দুর্দান্ত। আমি এই সম্পর্কে একটি প্রশ্ন আছে। -zবিকল্পগুলি যদি নিউলাইনগুলিকে চিকিত্সার জন্য গ্রেপ নির্দিষ্ট করে zero byte charactersতবে আমাদের কেন (?s)রেইজেক্সের দরকার? যদি এটি ইতিমধ্যে একটি নন-লাইন চরিত্রটি থাকে তবে .এটি সরাসরি মেলতে সক্ষম হবে না?
দুর্গা স্বরূপ

1
-z (ওরফে - নন-ডেটা) এবং (? গুলি) হ'ল মানক গ্রেপের সাথে একাধিক-লাইনের সাথে মিলের জন্য আপনার প্রয়োজন। ম্যাকোএসের লোকেরা, আপনার সিস্টেমে -z বা --null-data বিকল্পের প্রাপ্যতা সম্পর্কে মন্তব্য করুন!
জেকে ফাস্ট

4
-z অবশ্যই ম্যাকোজে উপলভ্য নয়
ডিলান নিকোলসন

33

এলডি উপরে বর্ণিত পোস্টার হিসাবে সিডের যথেষ্ট হওয়া উচিত,

d এর পরিবর্তে প্রিন্ট করতে আপনি কেবল পি ব্যবহার করতে পারেন:

sed -n '/abc/,/efg/p' file

16

আমি পিস্রিগ্র্যাপের উপর প্রচুর নির্ভর করেছিলাম, তবে নতুন গ্রেপের সাথে আপনাকে এর বেশ কয়েকটি বৈশিষ্ট্যের জন্য পিসিগ্রিপ ইনস্টল করতে হবে না। শুধু ব্যবহারgrep -P

ওপির প্রশ্নের উদাহরণে, আমি মনে করি যে নীচের বিকল্পগুলি সুন্দরভাবে কাজ করে, দ্বিতীয় প্রশ্নের সাথে কীভাবে আমি প্রশ্নটি বুঝি:

grep -Pzo "abc(.|\n)*efg" /tmp/tes*
grep -Pzl "abc(.|\n)*efg" /tmp/tes*

আমি লেখাটি / tmp / test1 হিসাবে অনুলিপি করেছি এবং 'g' মুছে ফেলেছি / tmp / test2 হিসাবে সংরক্ষণ করেছি। এখানে আউটপুটটি দেখানো হচ্ছে যে প্রথমটি ম্যাচ করা স্ট্রিংটি দেখায় এবং দ্বিতীয়টি কেবলমাত্র ফাইলের নাম দেখায় (সাধারণত-ম্যাচটি দেখাতে হয় এবং সাধারণত -l কেবল ফাইলের নাম দেখাতে হয়)। নোট করুন যে 'জেড' মাল্টলাইনের জন্য প্রয়োজনীয় এবং '(। | \ N)' এর অর্থ 'নিউলাইন ব্যতীত অন্য কোনও কিছুর সাথে' বা 'নিউলাইন' - অর্থ যেকোনো কিছু মিলবে:

user@host:~$ grep -Pzo "abc(.|\n)*efg" /tmp/tes*
/tmp/test1:abc blah
blah blah..
blah blah..
blah blah..
blah efg
user@host:~$ grep -Pzl "abc(.|\n)*efg" /tmp/tes*
/tmp/test1

আপনার সংস্করণটি যথেষ্ট নতুন কিনা তা নির্ধারণ করতে, চালান man grepএবং দেখুন এটির অনুরূপ কিছু শীর্ষে উপস্থিত হয়েছে কিনা:

   -P, --perl-regexp
          Interpret  PATTERN  as a Perl regular expression (PCRE, see
          below).  This is highly experimental and grep -P may warn of
          unimplemented features.

এটি জিএনইউ গ্রেপ 2.10 থেকে।


14

প্রথমে trনতুন লাইনগুলি অন্য কোনও চরিত্রের সাথে প্রতিস্থাপনের মাধ্যমে সহজেই করা যায় :

tr '\n' '\a' | grep -o 'abc.*def' | tr '\a' '\n'

এখানে, আমি \aএকটি নতুন লাইনের জায়গায় অ্যালার্ম চরিত্রটি (ASCII 7) ব্যবহার করছি । এই প্রায় আপনার লেখা কখনো পাওয়া যায়, এবং grepএকটি সঙ্গে এটি মেলাতে পারে ., অথবা এটি বিশেষভাবে মেলে দিয়ে \a


1
এটি আমার দৃষ্টিভঙ্গি ছিল তবে আমি ব্যবহার করছিলাম \0এবং এইভাবে প্রয়োজনীয় grep -aএবং মিল ছিল \x00... আপনি আমাকে সরলীকরণে সহায়তা করেছেন! echo $log | tr '\n' '\0' | grep -aoE "Error: .*?\x00Installing .*? has failed\!" | tr '\0' '\n'এখনecho $log | tr '\n' '\a' | grep -oE "Error: .*?\aInstalling .*? has failed\!" | tr '\a' '\n'
চার্লি গরিচানজ ২৮'১১

1
ব্যবহার grep -o
kyb

7

অজড এক-লাইনার:

awk '/abc/,/efg/' [file-with-content]

4
abcশেষের প্যাটার্নটি ফাইলটিতে উপস্থিত না থাকলে বা শেষের শেষের প্যাটার্নটি অনুপস্থিত থাকলে এটি আনন্দের সাথে ফাইলের শেষ থেকে শেষ পর্যন্ত প্রিন্ট করবে will আপনি এটি ঠিক করতে পারেন তবে এটি স্ক্রিপ্টটিকে বরং উল্লেখযোগ্যভাবে জটিল করে তুলবে।
ট্রিপলি

/efg/আউটপুট থেকে কীভাবে বাদ পড়বেন?
কিব

6

পার্ল ব্যবহার করতে পারলে আপনি খুব সহজেই এটি করতে পারেন।

perl -ne 'if (/abc/) { $abc = 1; next }; print "Found in $ARGV\n" if ($abc && /efg/); }' yourfilename.txt

আপনি এটি একটি একক নিয়মিত প্রকাশের সাহায্যেও করতে পারেন, তবে এর মধ্যে ফাইলের সম্পূর্ণ সামগ্রী একটি একক স্ট্রিংয়ে নেওয়া জড়িত থাকে, এটি বড় ফাইলগুলির সাথে খুব বেশি স্মৃতি গ্রহণ করতে পারে। সম্পূর্ণতার জন্য, এখানে সেই পদ্ধতিটি রয়েছে:

perl -e '@lines = <>; $content = join("", @lines); print "Found in $ARGV\n" if ($content =~ /abc.*efg/s);' yourfilename.txt

খুঁজে পাওয়া দ্বিতীয় উত্তরটি বেশ কয়েকটি লাইনের সাথে ম্যাচগুলি সহ একটি সম্পূর্ণ মাল্টি-লাইন ব্লকটি বের করতে কার্যকর ছিল - .*?ন্যূনতম মিল পেতে অ-লোভী মিল ( ) ব্যবহার করতে হয়েছিল।
রিচভেল

5

গ্রিপ দিয়ে কীভাবে করব তা আমি জানি না, তবে আমি এইভাবে জোর করে কিছু করব:

awk '/abc/{ln1=NR} /efg/{ln2=NR} END{if(ln1 && ln2 && ln1 < ln2){print "found"}else{print "not found"}}' foo

আপনি কীভাবে এটি করেন তা সতর্ক হওয়া উচিত though আপনি কি চান রেজেক্সটি স্ট্রিং বা পুরো শব্দটির সাথে মেলে? যথাযথ হিসাবে \ w ট্যাগ যুক্ত করুন। এছাড়াও, আপনি যখন উদাহরণটি বর্ণনা করেছেন তার সাথে এটি কঠোরভাবে মেনে চলার সময়, যখন efg এর পরে দ্বিতীয়বার আবির্ভূত হয় তখন এটি বেশ কার্যকর হয় না। যদি আপনি এটি পরিচালনা করতে চান তবে / অ্যাবসি / কেস ইত্যাদি ক্ষেত্রে যথাযথ যোগ করুন


3

দুঃখের বিষয়, আপনি পারবেন না। grepদস্তাবেজগুলি থেকে :

গ্রেপ প্রদত্ত PATTERN এর সাথে ম্যাচযুক্ত লাইনগুলির জন্য নামযুক্ত ইনপুট ফাইলগুলি (বা কোনও ফাইলের নাম না থাকলে স্ট্যান্ডার্ড ইনপুট) বা যদি একটি একক হাইফেন-বিয়োগ (-) ফাইলের নাম হিসাবে দেওয়া হয়) অনুসন্ধান করে ।


কি সম্পর্কেgrep -Pz
নাভারো

3

আপনি যদি প্রসঙ্গ ব্যবহার করতে ইচ্ছুক হন তবে টাইপ করে এটি অর্জন করা যেতে পারে

grep -A 500 abc test.txt | grep -B 500 efg

এটি "abc" এবং "efg" এর মধ্যে সমস্ত কিছু প্রদর্শন করবে যতক্ষণ না তারা একে অপরের 500 লাইনের মধ্যে থাকে।


3

আপনার যদি উভয় শব্দই একে অপরের নিকটবর্তী হয়, উদাহরণস্বরূপ 3 টি লাইনের বেশি নয়, আপনি এটি করতে পারেন:

find . -exec grep -Hn -C 3 "abc" {} \; | grep -C 3 "efg"

একই উদাহরণ কিন্তু কেবল * .txt ফাইলগুলি ফিল্টার করা:

find . -name *.txt -exec grep -Hn -C 3 "abc" {} \; | grep -C 3 "efg"

আপনি যদি নিয়মিত অভিব্যক্তি সহ সন্ধান করতে চান তবে আপনি grepকমান্ডের সাথে egrepকমান্ডও প্রতিস্থাপন করতে পারেন।


3

আমি কিছুদিন আগে একটি গ্রেপ বিকল্প প্রকাশ করেছি যা মাল্টলাইন ম্যাচিং বা শর্তাদি ব্যবহার করে সরাসরি এটি সমর্থন করে - আশা করি এটি এখানে অনুসন্ধান করা কিছু লোকের পক্ষে কার্যকর useful উদাহরণস্বরূপ কমান্ডগুলি দেখতে এরকম হবে:

একাধিক লাইন:

sift -lm 'abc.*efg' testfile

শর্তাবলী:

sift -l 'abc' testfile --followed-by 'efg'

আপনি উল্লেখ করতে পারেন যে 'efg' একটি নির্দিষ্ট সংখ্যক লাইনের মধ্যে 'abc' অনুসরণ করতে হবে:

sift -l 'abc' testfile --followed-within 5:'efg'

আপনি sift-tool.org- এ আরও তথ্য পেতে পারেন ।


আমি মনে করি না যে প্রথম উদাহরণটি sift -lm 'abc.*efg' testfileকাজ করে, কারণ ম্যাচটি লোভী এবং efgফাইলের শেষ অবধি সমস্ত লাইন আপ করে।
ডাঃ অ্যালেক্স আর ই

2

যদিও সেড বিকল্পটি সবচেয়ে সহজ এবং সহজ, এলজে-র ওয়ান-লাইনার দুর্ভাগ্যক্রমে সবচেয়ে বহনযোগ্য নয়। সি শেলের সংস্করণ দিয়ে আটকে থাকা লোকদের তাদের ব্যাঙ্গগুলি এড়াতে হবে:

sed -e '/abc/,/efg/\!d' [file]

দুর্ভাগ্যক্রমে এটি বাশ এট আল তে কাজ করে না।


1
#!/bin/bash
shopt -s nullglob
for file in *
do
 r=$(awk '/abc/{f=1}/efg/{g=1;exit}END{print g&&f ?1:0}' file)
 if [ "$r" -eq 1 ];then
   echo "Found pattern in $file"
 else
   echo "not found"
 fi
done

1

আপনি গ্রেপ ইনসেস ব্যবহার করতে পারেন তবে আপনি প্যাটার্নের ক্রমটিতে আগ্রহী নন।

grep -l "pattern1" filepattern*.* | xargs grep "pattern2"

উদাহরণ

grep -l "vector" *.cpp | xargs grep "map"

grep -lপ্রথম প্যাটার্নের সাথে মেলে এমন সমস্ত ফাইল সন্ধান করবে এবং দ্বিতীয় প্যাটার্নের জন্য xargs গ্রেপ হবে। আশাকরি এটা সাহায্য করবে.


1
এটি "প্যাটার্ন 1" এবং "প্যাটার্ন 2" ফাইলটিতে উপস্থিত হওয়া ক্রমটিকে অগ্রাহ্য করবে, যদিও - ওপি বিশেষভাবে নির্দিষ্ট করে যে কেবল "প্যাটার্ন 2" এর পরে "প্যাটার্ন 1" প্রদর্শিত হবে এমন ফাইলগুলি মেলানো উচিত।
এমিল লুন্ডবার্গ

1

সঙ্গে রূপালী অন্বেষী :

ag 'abc.*(\n|.)*efg'

রিং বহনকারী এর উত্তর অনুরূপ, কিন্তু পরিবর্তে Ag সঙ্গে। রৌপ্য অনুসন্ধানকারীগুলির গতির সুবিধাগুলি সম্ভবত এখানে আলোকিত হতে পারে।


1
এটি কাজ করে বলে মনে হয় না। (echo abctest; echo efg)|ag 'abc.*(\n|.)*efg'মেলে না
ফিরস্কি

1

আমি গ্রেপ এর জন্য -P বিকল্পটি ব্যবহার করে একাধিক ফাস্ট ফাইল থেকে একটি ফাস্ট সিকোয়েন্সটি বের করতে এটি ব্যবহার করেছি:

grep -Pzo ">tig00000034[^>]+"  file.fasta > desired_sequence.fasta
  • পার্ল ভিত্তিক অনুসন্ধানের জন্য পি
  • নিউ লাইন চর পরিবর্তে 0 বাইটে একটি লাইন শেষ করার জন্য z
  • o গ্রেপ পুরো লাইনটি ফেরত দেওয়ার পরে কী মিলছে তা ক্যাপচার করতে (যা এই ক্ষেত্রে যেহেতু আপনি করেছেন -z পুরো ফাইলটি)।

Regexp এর মূলটি হ'ল [^>]"প্রতীকের চেয়ে বড় নয়" এ অনুবাদ করে


0

বালু মোহন এর উত্তরের বিকল্প হিসাবে grep, কেবলমাত্র ব্যবহার করে প্যাটার্নগুলির ক্রম প্রয়োগ করা সম্ভব headএবং tail:

for f in FILEGLOB; do tail $f -n +$(grep -n "pattern1" $f | head -n1 | cut -d : -f 1) 2>/dev/null | grep "pattern2" &>/dev/null && echo $f; done

যদিও এটি খুব সুন্দর নয়। আরও পঠনযোগ্য ফর্ম্যাট করা:

for f in FILEGLOB; do
    tail $f -n +$(grep -n "pattern1" $f | head -n1 | cut -d : -f 1) 2>/dev/null \
    | grep -q "pattern2" \
    && echo $f
done

এই যেখানে সব ফাইল নাম প্রিন্ট হবে "pattern2"পরে প্রদর্শিত হবে "pattern1", অথবা যেখানে উভয় একই লাইনে প্রদর্শিত :

$ echo "abc
def" > a.txt
$ echo "def
abc" > b.txt
$ echo "abcdef" > c.txt; echo "defabc" > d.txt
$ for f in *.txt; do tail $f -n +$(grep -n "abc" $f | head -n1 | cut -d : -f 1) 2>/dev/null | grep -q "def" && echo $f; done
a.txt
c.txt
d.txt

ব্যাখ্যা

  • tail -n +i - এর পরে সমস্ত লাইন মুদ্রণ করুন i তম, সমেত
  • grep -n - তাদের লাইন নম্বরগুলির সাথে মিলের লাইনগুলিকে প্রিপেন্ড করুন
  • head -n1 - শুধুমাত্র প্রথম সারিতে মুদ্রণ করুন
  • cut -d : -f 1 - প্রথম কাটা কলামটি ব্যবহার করে মুদ্রণ করুন : ডিলিমিটার হিসাবে করুন
  • 2>/dev/null- নীরবতা tailত্রুটি আউটপুট যদি ঘটে থাকে$() অভিব্যক্তি খালি ফিরে আসে
  • grep -q- নিরবতা grepএবং কোনও মিল পাওয়া গেলে সাথে সাথে ফিরে আসুন, যেহেতু আমরা কেবল প্রস্থান কোডটিতে আগ্রহী

কেউ দয়া করে ব্যাখ্যা করতে পারেন &>? আমি এটিও ব্যবহার করছি, তবে আমি এটি কোথাও নথিভুক্ত কখনও দেখিনি। বিটিডব্লিউ, কেন আমাদের আসলে গ্রেপকে চুপ করে বসে থাকতে হবে? grep -qকৌতুক পাশাপাশি করবেন না?
সিনট্যাক্সেরর

1
&>বাশকে স্ট্যান্ডার্ড আউটপুট এবং স্ট্যান্ডার্ড ত্রুটি উভয়ই পুনর্নির্দেশ করতে বলেছে, ব্যাশ ম্যানুয়ালটিতে REDIRECTION দেখুন। আপনি খুব ঠিক যে আমরা ঠিক পাশাপাশি grep -q ...পরিবর্তে করতে পারে grep ... &>/dev/null, ভাল ধরা!
এমিল লুন্ডবার্গ

সেটাই ভাবছি. প্রচুর বিশ্রী অতিরিক্ত টাইপিংয়ের ব্যথা দূর করবে। ব্যাখ্যার জন্য ধন্যবাদ - সুতরাং আমি অবশ্যই ম্যানুয়ালটিতে কিছুটা এড়িয়ে গেছি। (কিছুক্ষণ আগে এটিতে দূরবর্তী সম্পর্কিত কিছু সন্ধান করা হয়েছে)) --- আপনি নিজের উত্তরে এটি পরিবর্তন করার
বিষয়টিও

0

এটা কি কাজ করা উচিত ?!

perl -lpne 'print $ARGV if /abc.*?efg/s' file_list

$ARGVfile_list /sনতুন লাইন জুড়ে সংশোধক অনুসন্ধানগুলি থেকে পড়ার সময় বর্তমান ফাইলটির নাম রয়েছে ।


0

*.shডিরেক্টরিগুলি পরিদর্শন করা রোধ করার জন্য ফাইলপ্যাটার্নটি গুরুত্বপূর্ণ। অবশ্যই কিছু পরীক্ষাও তা আটকাতে পারে।

for f in *.sh
do
  a=$( grep -n -m1 abc $f )
  test -n "${a}" && z=$( grep -n efg $f | tail -n 1) || continue 
  (( ((${z/:*/}-${a/:*/})) > 0 )) && echo $f
done

দ্য

grep -n -m1 abc $f 

সর্বাধিক 1 টি মিলছে এবং লিনেনবারটি (-n) প্রদান করে। যদি কোনও মিল খুঁজে পাওয়া যায় (টেস্ট-এন ...) ইফগের শেষ ম্যাচটি সন্ধান করুন (সমস্ত সন্ধান করুন এবং লেজ -n 1 দিয়ে শেষটি নিন)।

z=$( grep -n efg $f | tail -n 1)

অন্যথায় চালিয়ে যান।

যেহেতু ফলাফলটি এমন কিছু যা 18:foofile.sh String alf="abc";আমাদের ":" থেকে লাইনের শেষ অবধি কেটে ফেলতে হবে।

((${z/:*/}-${a/:*/}))

যদি দ্বিতীয় প্রকাশের শেষ ম্যাচটি প্রথম ম্যাচটি প্রথম ম্যাচটি করে তবে একটি ইতিবাচক ফলাফলটি ফিরে পাওয়া উচিত।

তারপরে আমরা ফাইলের নামটি রিপোর্ট করি echo $f


0

সাধারণ কিছু কেন নয়:

egrep -o 'abc|efg' $file | grep -A1 abc | grep efg | wc -l

0 বা ধনাত্মক পূর্ণসংখ্যা প্রদান করে।

egrep -o (কেবল ম্যাচগুলি দেখায়, কৌশল: একই লাইনে একাধিক মিলগুলি মাল্টি-লাইন আউটপুট উত্পাদন করে যেমন তারা বিভিন্ন লাইনে থাকে)

  • grep -A1 abc (এবিসি এবং তারপরে লাইনটি প্রিন্ট করুন)

  • grep efg | wc -l (একই বা নিম্নলিখিত লাইনগুলিতে abc এর পরে পাওয়া efg লাইনের 0-n গণনা, ফলাফলটি যদি 'যদি "ব্যবহার করা যায় তবে)

  • প্যাটার্ন ম্যাচিংয়ের প্রয়োজন হলে গ্রেপকে egrep ইত্যাদি হিসাবে পরিবর্তন করা যেতে পারে


0

আপনি যে দুটি স্ট্রিং 'এবিসি' এবং 'ইফজি' খুঁজছেন তার মধ্যে দূরত্ব সম্পর্কে যদি কিছুটা অনুমান থাকে তবে আপনি এটি ব্যবহার করতে পারেন:

grep -r . -e 'abc' -A num1 -B num2 | grep 'efg'

এইভাবে, প্রথম গ্রেপ তার পরে 'abc' প্লাস # num1 লাইন এবং তার পরে # num2 রেখাগুলি দিয়ে রেখাটি ফিরিয়ে দেবে, এবং দ্বিতীয় গ্রেপ 'efg' পেতে তাদের সকলের মধ্য দিয়ে চলে যাবে। তারপরে আপনি জানতে পারবেন কোন ফাইলগুলিতে তারা একসাথে উপস্থিত হয়।


0

কয়েক মাস আগে প্রকাশিত ইউগ্রিপ সহ :

ugrep 'abc(\n|.)+?efg'

এই সরঞ্জামটি গতির জন্য অত্যন্ত অনুকূলিত। এটি জিএনইউ / বিএসডি / পিসিআরই-গ্রেপ সামঞ্জস্যপূর্ণ।

নোট করুন যে আমাদের অলস পুনরাবৃত্তিটি ব্যবহার করা উচিত +?, যদি না আপনি ফাইলের efgশেষ অবধি সমস্ত লাইন একসাথে মেলে না চান efg


-3

এই কাজ করা উচিত:

cat FILE | egrep 'abc|efg'

যদি একাধিক মিল থাকে তবে আপনি গ্রেপ-ভি ব্যবহার করে ফিল্টার আউট করতে পারেন


2
যতক্ষণ এই কোড স্নিপেট স্বাগত, এবং কিছু সাহায্য প্রদান করতে পারে, এটা হবে ব্যাপকভাবে উন্নত যদি এটা একটি ব্যাখ্যা অন্তর্ভুক্ত এর কিভাবে এবং কেন এই সমাধান সমস্যা। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, কেবল এখনই জিজ্ঞাসা করা ব্যক্তি নয়! দয়া করে ব্যাখ্যা যুক্ত করতে আপনার উত্তর সম্পাদনা করুন, এবং কোন সীমাবদ্ধতা এবং অনুমানগুলি প্রযোজ্য তা একটি ইঙ্গিত দিন।
টবি স্পিড

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