এর সাথে বিন্দুযুক্ত একটি স্ট্রিং সন্ধান করতে গ্রেপ ব্যবহার করে


194

আমি 0.49কমান্ডটি ব্যবহার করে একটি স্ট্রিং (বিন্দু সহ) অনুসন্ধান করার চেষ্টা করছি

grep -r "0.49" *

কিন্তু কি যে আমিও অবাঞ্ছিত ফলাফল যেমন যা স্ট্রিং রয়েছে পাচ্ছি হয় 0449, 0949ইত্যাদি ,. বিষয়টি লিনাক্সটি বিন্দু (।) কে কোনও চরিত্র হিসাবে বিবেচনা করছে এবং সমস্ত ফলাফল আনছে। তবে আমি ফলাফলটি কেবল "0.49" এর জন্য পেতে চাই।

উত্তর:


234

grepregexes ব্যবহার করে; .রিজেক্সের অর্থ "যে কোনও চরিত্র"। আপনি যদি একটি আক্ষরিক স্ট্রিং চান, ব্যবহার grep -F, fgrepঅথবা অব্যাহতি .করার \.

ডাবল উদ্ধৃতিতে আপনার স্ট্রিং মোড়ানো ভুলবেন না। অন্যথায় আপনার ব্যবহার করা উচিত\\.

সুতরাং, আপনার আদেশটি হতে হবে:

grep -r "0\.49" *

অথবা

grep -r 0\\.49 *

অথবা

grep -Fr 0.49 *

58
\\.এটি কাজ করার জন্য আমার দু'বার মতো পালাতে হবে। আমি zsh ব্যবহার করছি।
নিকোস রেনিরিস

5
@ নিকোসরেনিরিস আপনি কি ডাবল উদ্ধৃতি দিয়ে আপনার গ্রেপিংয়ের স্ট্রিংটি আবদ্ধ করেছিলেন?
জাস্টাস রোমিজন

@ জাস্টাসরোমিজন আমার মনে হয় আমি করেছি, হ্যাঁ।
নিকোস রেনিরিয়াস

15
আপনার \\.খুব বেশি বাশ ব্যবহার "\."করতে হবে, বা এটি শেল থেকে বাঁচতে ব্যবহার করতে হবে।
টমোফুমি

36

grep -F -r '0.49' *0.49 কে নিয়মিত প্রকাশের পরিবর্তে "ফিক্সড" স্ট্রিং হিসাবে বিবেচনা করে। এটি .এর বিশেষ অর্থ হারাতে সক্ষম করে।


22

আপনি .হিসাবে পালাতে হবে "0\.49"

.হ'ল কোনও রেজেক্স মেটা-চরিত্র যা কোনও অক্ষরের সাথে মেলে (নতুন লাইন বাদে)। আক্ষরিক সময়ের সাথে মিল রাখতে আপনার এড়াতে হবে।



5

আপনি "[।]" ব্যবহার করতে পারেন

grep -r "0[.]49"

5

এখানে অনেকগুলি উত্তর রয়েছে যার সাথে বিন্দুটি থেকে পালানোর পরামর্শ দেওয়া হয়েছে \.তবে আমি বারবার এই সমস্যাটিতে চলে আসছি: \.আমাকে একই ফলাফল দেয়.

তবে এই দুটি এক্সপ্রেশন আমার পক্ষে কাজ করে:

$ grep -r 0\\.49 *

এবং:

$ grep -r 0[.]49 *

আমি উবুন্টু এবং আর্চলিনাক্সে একটি "সাধারণ" বাশ শেল ব্যবহার করছি।


3
আপনাকে শেল থেকে রেজেক্স উদ্ধৃত করতে হবে বা ব্যাকস্ল্যাশ নিজেই এড়িয়ে যেতে হবে যাতে শেলটি সেটিকে গ্রাস করে না। grep '\.'বা grep \\.(আমি পূর্বেরটিকে দৃ strongly়ভাবে সুপারিশ করব the মূল প্রশ্নের মতো ডাবল কোটসের কাজও; তবে একক উদ্ধৃতিগুলি বোঝা এবং ব্যবহার করা সহজ example উদাহরণস্বরূপ, ডাবল উদ্ধৃতি সহ, আপনাকে কিছু পরিস্থিতিতে এখনও ব্যাকস্ল্যাশ দ্বিগুণ করতে হবে )।
ট্রিপলি

আইএমএইচও, এটিই সবচেয়ে পরিষ্কার সঠিক উত্তর, @ ট্রিপলির মন্তব্যে এটি সর্বাধিক সম্পূর্ণ। [] এর ব্যবহার (যা একটি একক চরিত্রের সাথে মেলে চরিত্রের উপসেট উপস্থাপন করে) একটি দুর্দান্ত হ্যাক।
জিংগুট

@ জ্রিংগুট সিরিয়াসলি? আমি মনে করি এটি মোটেও পরিষ্কার নয় - এটি উদ্ধৃতকরণের সাথে পরিচিত নয় এমন কারওর কাছ থেকে আসা ফলো-আপ প্রশ্নের মতো মনে হচ্ছে।
ট্রিপলি

এটি স্পষ্ট কারণ উভয় এক্সপ্রেশন সরাসরি কাজ করে এবং প্রকৃতপক্ষে আরও অনেকে উদ্ধৃতিটি ধরে নেয় বা শেল দ্বারা গৌণ ব্যাখ্যা হিসাবে তুচ্ছ হিসাবে এড়াতে ডাবল পালাতে হবে। আমি মন্তব্যটি আর পরিবর্তন করতে পারি না (5 মিনিটের সীমা)। আমার মন্তব্যটি আরও ভাল হতে পারে: "এটি, @ ট্রাইপলির মন্তব্যের সাথে মিলিত হলে এটি সবচেয়ে সম্পূর্ণ উত্তর। কারণ উভয় কমান্ড তাত্ক্ষণিকভাবে কাজ করে এবং উদ্ধৃতি দিয়ে এটি সম্পূর্ণ হয়"
০৯

1
আমি সাধারণত যা প্রস্তাব করি তা হ'ল "আপনার নিয়মিত এক্সপ্রেশনগুলি সর্বদা একক-উদ্ধৃতি"। এটি "সম্পূর্ণ" নয় তবে এটি কাজটি সম্পন্ন করে এবং বোঝায় যে আপনি হয় সরল নিয়ম অনুসারে উদ্ধৃতি বুঝতে বা বাঁচতে হবে।
ট্রিপলি


4

আপনি ডট এবং অন্যান্য বিশেষ অক্ষরগুলি ব্যবহার করে escape

যেমন। গ্রেপ -r "0 \ .49"


ভবিষ্যতের পাঠককে একটি অনুস্মারক, \.কোটকে ঘিরে এটি কাজ করা প্রয়োজন।
ফলমূল

1

আপনি বিকল্পটিও অনুসন্ধান করতে পারেন যা মূলত সমস্ত বিশেষ অক্ষরকে উপেক্ষা করে এবং গ্রেপ দ্বারা এটি ব্যাখ্যা করা হবে না।

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