গ্রেপ কি অনুসন্ধানের ধরণটির সাথে মেলে এমন শব্দগুলি দেখাতে পারে?


685

অনুসন্ধানের অভিব্যক্তির সাথে মিলে যাওয়া ফাইলগুলি থেকে গ্রেপ আউটপুট "শব্দ" তৈরি করার কোনও উপায় আছে কি?

আমি যদি সমস্ত উদাহরণ খুঁজে পেতে চাই, তবে বেশ কয়েকটি ফাইলগুলিতে "ম" বলুন, আমি এটি করতে পারি:

grep "th" *

তবে আউটপুটটি এমন কিছু হবে (সাহসী আমার দ্বারা);

কিছু টেক্সট-ফাইল: বিড়াল বসে মাদুর  
কিছু-অন্যান্য-টেক্সট ফাইল: দ্রুত বাদামী শিয়াল  
এখনো আরেকটি কার্যকর টেক্সট-ফাইল: আমি আশা করি এই এটা ব্যাখ্যা করে পুঙ্খানুপুঙ্খভাবে 

একই অনুসন্ধানটি ব্যবহার করে আমি আউটপুটটিতে যা চাই তা হ'ল:

the
the
the
this
thoroughly

গ্রেপ ব্যবহার করে এটি কি সম্ভব? বা সরঞ্জামের অন্য সংমিশ্রণটি ব্যবহার করছেন?


2
ড্যান মিডউড সলিউশন পুরোপুরি কাজ করে এবং কৃতিত্বের দাবিদার।
হাসিশ

লাইনগুলি পরিবর্তন না করে এই মেলানো শব্দগুলি মুদ্রণের কোনও উপায় আছে কি? পরিবর্তে ম্যাচ করা স্ট্রিং একই লাইনে থাকা উচিত?
ভাষাতত্ত্ববিদ

উত্তর:


955

গ্রেপ -o চেষ্টা করুন

grep -oh "\w*th\w*" *

সম্পাদনা করুন: ফিলের মন্তব্য থেকে মিলছে

ডক্স থেকে :

-h, --no-filename
    Suppress the prefixing of file names on output. This is the default
    when there is only  one  file  (or only standard input) to search.
-o, --only-matching
    Print  only  the matched (non-empty) parts of a matching line,
    with each such part on a separate output line.

9
@ ব্যবহারকারী 181548, গ্রেপ -o বিকল্পটি কেবল জিএনইউ গ্রেপের জন্য কাজ করে। সুতরাং আপনি যদি জিএনইউ গ্রেপ ব্যবহার না করে থাকেন তবে এটি আপনার পক্ষে কার্যকর নাও হতে পারে।
ksinkar

5
@ এ বি বি এটি নির্ভর করে আপনি মেলে থাকা ফাইলটির নাম প্রদর্শন করতে চান কিনা। এটি কোন অবস্থার অধীনে এটি নিশ্চিত এবং তা প্রদর্শন করে না তা আমি নিশ্চিত নই, তবে আমি জানি যে আমি যখন বেশ কয়েকটি ডিরেক্টরিতে গ্রেপ ব্যবহার করতাম তখন এটি সমস্ত মিলে যাওয়া ফাইলগুলির জন্য সম্পূর্ণ ফাইলের পথটি প্রদর্শন করেছিল, যখন -h সহ এটি প্রদর্শিত হয়েছিল কোন ফাইলটি সে সম্পর্কে কোনও নির্দিষ্টকরণ ছাড়াই মিলে যাওয়া শব্দগুলি। সুতরাং, মূল প্রশ্নের সাথে মেলে, আমি মনে করি এটি নির্দিষ্ট পরিস্থিতিতে এটি প্রয়োজনীয় necessary
লোকম্যাক

1
এর "\w*th\w*" *অর্থের জন্য আমার একটি ব্যাখ্যা প্রয়োজন , তাই আমি অনুভব করেছি যে আমি পোস্ট করব। \wহ'ল [_ [: অ্যালনাম:]], সুতরাং এটি মূলত যে কোনও "শব্দের সাথে মেলে যা 'ত' থাকে (যেহেতু \wস্থানটি অন্তর্ভুক্ত করে না)। উদ্ধৃত বিভাগের পরে * একটি গ্লোব যার জন্য ফাইল (অর্থাত্ এই ডিরেক্টরিতে সমস্ত ফাইলের মিল রয়েছে)
জেরেমিসপ্রাইফাইল

1
\wসাধারণত পোর্টেবল হয় না grep -E; যথাযথ বহনযোগ্যতার জন্য, এর [[:alnum:]]পরিবর্তে পসিক্স অক্ষর শ্রেণীর নাম ব্যবহার করুন (বা [_[:alnum:]]যদি আপনি সত্যিই আন্ডারস্কোরটিও চান তবে; বা grep -Pআপনার প্ল্যাটফর্মটিতে এটি আছে কিনা চেষ্টা করুন )।
ট্রিপলি

@ এবিবি ওপি দ্বারা দেখানো কাঙ্ক্ষিত আউটপুট দেওয়া -hকি আমি বলতে চাই তা সম্পূর্ণ প্রয়োজন ..?
এল রোনোকো

81

ক্রস বিতরণ নিরাপদ উত্তর (উইন্ডোজ minGW সহ?)

grep -h "[[:alpha:]]*th[[:alpha:]]*" 'filename' | tr ' ' '\n' | grep -h "[[:alpha:]]*th[[:alpha:]]*"

যদি আপনি গ্রিপের পুরানো সংস্করণ ব্যবহার করেন (যেমন ২.৪.২) যা -o বিকল্পটি অন্তর্ভুক্ত করে না। উপরের ব্যবহার করুন। অন্যটি নীচের সংস্করণ বজায় রাখতে সহজতর ব্যবহার করুন।

লিনাক্স ক্রস বিতরণ নিরাপদ উত্তর

grep -oh "[[:alpha:]]*th[[:alpha:]]*" 'filename'

সংক্ষিপ্তসারগুলি -ohফাইলের বিষয়বস্তুর সাথে নিয়মিত প্রকাশের সাথে মেলে (এবং এটির ফাইল নাম নয়), যেমন আপনি কীভাবে ভিআইএম / ইত্যাদিতে নিয়মিত অভিব্যক্তিটি প্রত্যাশা করবেন ... আপনি তখন কোন শব্দ বা নিয়মিত অভিব্যক্তিটি অনুসন্ধান করবেন এটি শেষ আপনি! যতক্ষণ আপনি পসিক্সে থেকে যান এবং পার্ল সিনট্যাক্স না হয়ে থাকেন (নীচে দেখুন)

গ্রেপ জন্য ম্যানুয়াল থেকে আরও

-o      Print each match, but only the match, not the entire line.
-h      Never print filename headers (i.e. filenames) with output lines.
-w      The expression is searched for as a word (as if surrounded by
         `[[:<:]]' and `[[:>:]]';

আসল উত্তরটি সবার পক্ষে কাজ করে না তার কারণ

\wপ্ল্যাটফর্ম থেকে প্ল্যাটফর্মের ব্যবহারের পরিবর্তিত হয় এটির বর্ধিত "পার্ল" সিনট্যাক্স হিসাবে। যেমন, সেই গ্রেপ ইনস্টলেশনটি পসিক্স অক্ষর শ্রেণীর সাথে কাজ করতে সীমাবদ্ধ যা [[:alpha:]]এর পার্ল সমতুল্য নয় \wআরও জানতে নিয়মিত প্রকাশের উইকিপিডিয়া পৃষ্ঠাটি দেখুন

শেষ পর্যন্ত, উপরের পসিক্স উত্তরটি গ্রাফের জন্য প্ল্যাটফর্ম (মূল হিসাবে) নির্বিশেষে অনেক বেশি নির্ভরযোগ্য হবে

গ্রে-বিনা -o বিকল্পের সমর্থন হিসাবে, প্রথম গ্রেপ প্রাসঙ্গিক রেখাগুলি আউটপুট করে, টিআর স্পেসগুলি নতুন লাইনে বিভক্ত করে, কেবলমাত্র সংশ্লিষ্ট লাইনের জন্য চূড়ান্ত গ্রেপ ফিল্টার করে।

(পিএস: আমি জানি এখন অবধি বেশিরভাগ প্ল্যাটফর্মগুলিই \ ডাব্লু এর জন্য প্যাচ করা হত .... তবে সবসময় পিছিয়ে রয়েছে এমনগুলি রয়েছে)

@ অ্যাডামরোসেনফিল্ড উত্তর থেকে "-o" কাজের জন্য ক্রেডিট


1
কেবলমাত্র জিএনইউ গ্রেপ-এ কাজ করার বিষয়ে কী (কীসিংকার গৃহীত উত্তরের মন্তব্যে উল্লেখ করেছেন)?
ব্রিলিয়ান্ড

@ ব্রিলিয়ান্ড হুম, '-o' সমর্থন করে না এমন একটি লিনাক্স বাস্তবায়ন খুঁজে পেতে আমার সমস্যা হচ্ছে, আমি কোন প্ল্যাটফর্মটি পরীক্ষা করতে জানি যদি আমি জানি তবে আমি একটি কাজ সন্ধান করতে পারি।
পিকোক্রিটর

@ পিকো -oউইন্ডোজ গ্রেপ-এ বিকল্পটি উপস্থিত নেই যা গিট প্যাকেজ (মিনিজিডাব্লু?) দিয়ে ইনস্টল করে: "c:\Program Files (x86)\Git\bin\grep" --version grep (GNU grep) 2.4.2
ব্রুস পিটারসন

@ ব্রুসপিটারসন আমি -o এর জন্য অ্যাডামরোসেনফিল্ডের কাজের উত্তরটি যুক্ত করেছি: উইন্ডোজের গিটটিতে ট্র / শেড এবং এর সংস্করণ রয়েছে কিনা তা পরীক্ষা করতে আমাকে সহায়তা করুন। সুতরাং আমি পরীক্ষা করতে পারি যে এই কাজটি কার্যকর হয়েছে কিনা
পিকোক্রিটর

@ পিকো: জিআইটির জন্য: জিএনইউ সেড সংস্করণ ৪.২.১, ট্র (জিএনইউ টেক্সটিলস) ২.০
ব্রুস পিটারসন

46

এটি আপনার ভাবার চেয়ে সহজ। এটা চেষ্টা কর:

egrep -wo 'th.[a-z]*' filename.txt #### (Case Sensitive)

egrep -iwo 'th.[a-z]*' filename.txt  ### (Case Insensitive)

কোথায়,

 egrep: Grep will work with extended regular expression.
 w    : Matches only word/words instead of substring.
 o    : Display only matched pattern instead of whole line.
 i    : If u want to ignore case sensitivity.

2
এটি 4+ বছর আগে বিদ্যমান উত্তরগুলিতে কিছু যোগ করবে বলে মনে হচ্ছে না।
ট্রিপলি

3
ট্রিপলি আমি দেখতে পেলাম আমার পদ্ধতির উন্নতি এবং সহজ তাই আমি এটি পোস্ট করেছি।
অভিনন্দন প্রসাদ

42

আপনি স্পেসগুলি নিউলাইনগুলিতে এবং তারপরে গ্রেপ, যেমন:

cat * | tr ' ' '\n' | grep th

18
কোন বিড়াল নেই। tr '' '\ n' <ফাইল | গ্রেপ ম। বড় ফাইলগুলির জন্য ধীর।
ghostdog74

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

@ ঘোস্টডোগ 74৪: ভাল কথা, আপনার যদি ফাইলের চেয়ে বেশি থাকে তবে আপনার বিড়াল ব্যবহার করতে হবে। @ নীল বাল্ডউইন: আপনি কি নিশ্চিত যে আপনি এটি টাইপ করেছেন? যখন কেবলমাত্র একটি ইনপুট ফাইল থাকে (এই ক্ষেত্রে স্টিডিন), গ্রেপ ফাইলের নাম মুদ্রণ করে না।
অ্যাডাম রোজেনফিল্ড

@ অ্যাডাম - হ্যাঁ, দুঃখিত অ্যাডাম, এটি একটি ফাইলের সাথে কাজ করে তবে একাধিক নয়।
নিল বাল্ডউইন

4
@ ঘোস্টডোগ 74৪ যদি ধীর অংশটি হয় তবে trতিনি grepপ্রথমে করতে পারতেন , তাই trকেবল মিলিত grep th filename | tr ' ' '\n' | grep th
লাইনেই


11

শুধুমাত্র ম্যাচিং এবং পার্লের জন্য গ্রেপ কমান্ড

grep -o -P 'th.*? ' filename

3
শুধুমাত্র মিলিত গ্রুপের প্রদর্শন সম্পর্কে কী?
বিশ্ব মিশ্র 6

এটি কাজ করে না; এটি কেবল কখনও পাওয়া যাবে thকারণ আপনি ওয়াইল্ডকার্ডের সবচেয়ে সংক্ষিপ্ততম পুনরাবৃত্তির অনুরোধ করেছেন।
ট্রিপলি

@ ট্রিপলি - এতে সমস্যা হবে না, কারণ রেইগেক্সের শেষে একটি জায়গা অন্তর্ভুক্ত রয়েছে। যাইহোক, এটি এমন শব্দগুলি মিস করবে যাগুলির পরে কোনও ফাঁকা স্থান নেই, যেমন লাইনগুলির শেষ প্রান্তে।
কেন উইলিয়ামস

8

সিনট্যাক্স মনে রাখতে আমি অ্যাডাব্লিকের শক্তিতে অসন্তুষ্ট ছিলাম তবে এটি করার জন্য একটি ইউটিলিটি ব্যবহার করার ধারণাটি আমার পছন্দ হয়েছিল।

দেখে মনে হচ্ছে আক্ক (বা আপনি যদি উবুন্টু ব্যবহার করেন তবে এস্ক-গ্রেপ) সহজেই এটি করতে পারেন:

# ack-grep -ho "\bth.*?\b" *

the
the
the
this
thoroughly

আপনি যদি -h পতাকাটি বাদ দেন তবে:

# ack-grep -o "\bth.*?\b" *

some-other-text-file
1:the

some-text-file
1:the
the

yet-another-text-file
1:this
thoroughly

একটি বোনাস হিসাবে, আপনি --outputখুঁজে পাওয়া সর্বাধিক সহজ বাক্য গঠন সহ আরও জটিল অনুসন্ধানের জন্য আপনি এটি করতে পতাকাটি ব্যবহার করতে পারেন :

# echo "bug: 1, id: 5, time: 12/27/2010" > test-file
# ack-grep -ho "bug: (\d*), id: (\d*), time: (.*)" --output '$1, $2, $3' test-file

1, 5, 12/27/2010


4

"আইকন-" দিয়ে শুরু করে সমস্ত শব্দ অনুসন্ধান করতে নিচের কমান্ডটি নিখুঁত কাজ করে। আমি এখানে আ্যাক ব্যবহার করছি যা গ্রেপের অনুরূপ তবে আরও ভাল বিকল্প এবং চমৎকার ফর্ম্যাটিং সহ।

ack -oh --type=html "\w*icon-\w*" | sort | uniq

3

আপনি প্যাকগ্রিপ চেষ্টাও করতে পারেন । গ্রেপ-এ একটি -wবিকল্পও রয়েছে তবে কিছু ক্ষেত্রে এটি প্রত্যাশার মতো কাজ করে না।

উইকিপিডিয়া থেকে :

cat fruitlist.txt
apple
apples
pineapple
apple-
apple-fruit
fruit-apple

grep -w apple fruitlist.txt
apple
apple-
apple-fruit
fruit-apple

3

আমার অনুরূপ সমস্যা ছিল, গ্রেপ / প্যাটার্ন রেজেক্স এবং আউটপুট হিসাবে "মিলিত প্যাটার্ন পাওয়া গেছে" সন্ধান করছি।

শেষে আমি egrep ব্যবহার করেছি (গ্রেপ -e বা -G-তে একই রেজিেক্স আমাকে উদাহরণস্বরূপ একই ফলাফল দেয়নি) -অ বিকল্পটি দিয়ে

সুতরাং, আমি এটির মতো কিছু হতে পারে বলে মনে করি (আমি একজন রেইজেক্স মাস্টার নই):

egrep -o "the*|this{1}|thoroughly{1}" filename

অকেজো {1}কোয়ান্টিফায়ারগুলি বাদ দেওয়া উচিত। বা আপনি যদি সামঞ্জস্য থাকতে চান t{1}h{1}e{1}ইত্যাদি
ট্রিপলি

এটি কি একই লাইনে মুদ্রণ করতে পারে?
凡 凡

-1

আপনি আপনার গ্রেপ আউটপুটটি পার্লের মতো পাইপ করতে পারেন:

grep "th" * | perl -n -e'while(/(\w*th\w*)/g) {print "$1\n"}'

9
এটি সঠিক ফলাফল দেবে না। এছাড়াও, যদি পার্ল ব্যবহার করা হয় তবে গ্রেপ ব্যবহার করার দরকার নেই। পার্ল সব কিছু।
ghostdog74

ত্রুটিটি চিহ্নিত করার জন্য ধন্যবাদ, ঘোস্টডোগ .৪। আমি প্রথমটি নয়, লাইনে সমস্ত শব্দ মুদ্রণের জন্য এটি পরিবর্তন করেছি।

যেমন আমি বলেছি, গ্রেপ প্রয়োজন হয় না। পার্ল-এন -ই'র মধ্যে (/ (\ গুলি + ম * ডাব্লু *) / জি) {"$ 1 \ n"} 'ফাইলটি মুদ্রণ করুন
ভূতডোগ 74

7
আপনার উপর আমি শুধু একটি বিষয় বর্ণনা করছি। যদি এটি প্রয়োজনীয় না হয় তবে এটি করবেন না। যে অতিরিক্ত "|" আপনার আরও একটি প্রক্রিয়া ব্যয় হবে।
ghostdog74

1
পার্ল ৫.১০ বা তার পরে: পার্ল-এনই '@ এ = / (রিজেক্সএক্স) / ig; "'n", @ এ'
অধ্যাপক ফোটন

-1
$ grep -w

গ্রেপ ম্যান পৃষ্ঠা থেকে অংশ:

-ডাব্লু: পুরো শব্দের সাথে মিল রেখে কেবল সেই লাইনগুলিই নির্বাচন করুন। পরীক্ষাটি হ'ল মেলানো সাবস্ট্রিংটি অবশ্যই লাইনের শুরুতে হওয়া উচিত, বা তার আগে কোনও শব্দহীন উপাদানযুক্ত চরিত্রের দ্বারা হওয়া উচিত।


1
এটি এখনও মিলটি সম্পূর্ণ লাইনটি মুদ্রণ করবে। এটি আসল মিলটিকে সীমাবদ্ধ করে যাতে theআর মেলে না যেমন "এই" বা "স্নান"।
ট্রিপলি

-6

ripgrep

এখানে উদাহরণ ব্যবহার করে ripgrep:

rg -o "(\w+)?th(\w+)?"

এটি মিলবে সমস্ত শব্দের সাথে th

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