গ্রেপ এবং একটি ডলার সাইন এড়ানো


31

কোন ফাইলগুলির স্ট্রিং রয়েছে তা জানতে চাই $Id$

grep \$Id\$  my_dir/mylist_of_files

0 টি ঘটনা উপস্থিত করে।

আমি আবিষ্কার করেছি যে আমাকে ব্যবহার করতে হবে

grep \$Id$ my_dir/mylist_of_files

তারপরে আমি দেখতে পাচ্ছি যে $Idআউটপুটটিতে রঙিন, অর্থাৎ এটি মিলছে।

আমি দ্বিতীয়টির সাথে কীভাবে মিলব $এবং কেন \$Id\$কাজ করে না ।

দ্বিতীয়টি $শেষ চরিত্র কিনা তা কিছু যায় আসে না।

আমি grep2.9 ব্যবহার করি ।


আমার প্রশ্ন পোস্ট করার আগে আমি গুগল ব্যবহার করেছি ...

আমি একটি উত্তর খুঁজে পেয়েছি

টেস্ট 2 নামের ফাইলটিতে একটি ডলার (ডলার সাইন) অনুসন্ধান করতে, প্রবেশ করুন:

গ্রেপ \\ $ পরীক্ষা 2

শেলটিকে গ্রেপ কমান্ডে একটি \ $ (একক ব্যাকস্ল্যাশ, ডলার চিহ্ন) পাস করতে বাধ্য করার জন্য \\ (ডাবল ব্যাকস্ল্যাশ) অক্ষরগুলি প্রয়োজনীয়। Single (একক ব্যাকস্ল্যাশ) অক্ষরটি গ্রেপ কমান্ডকে একটি এক্সপ্রেশন চরিত্রের পরিবর্তে নিম্নোক্ত অক্ষরটিকে (এই উদাহরণে $) আক্ষরিক চরিত্র হিসাবে বিবেচনা করতে বলে। ব্যাকস্ল্যাশের মতো এস্কেপ অক্ষর ব্যবহারের প্রয়োজনীয়তা এড়াতে fgrep কমান্ডটি ব্যবহার করুন।

তবে আমি বুঝতে পারি না কেন grep \$Idকাজ করে এবং কেন grep \\$Id\\$হয় না।

আমি কিছুটা বিভ্রান্ত ...

উত্তর:


25

এখানে 2 টি পৃথক সমস্যা রয়েছে।

  1. grepবেসিক নিয়মিত এক্সপ্রেশন (বিআরই) ব্যবহার করে এবং $কেবল এক্সপ্রেশন শেষে BRE এর একটি বিশেষ চরিত্র। এই ফল যে এর 2 দৃষ্টান্ত হল $মধ্যে $Id$সমান নয়। প্রথমটি হ'ল একটি সাধারণ চরিত্র এবং দ্বিতীয়টি অ্যাঙ্কর যা লাইনটির শেষের সাথে মেলে। দ্বিতীয় $ম্যাচকে আক্ষরিক বানানোর জন্য $আপনাকে এটি থেকে পালাতে হবে, অর্থাৎ $Id\$। প্রথমটি থেকে বেরিয়ে আসাও $কাজ করে: \$Id\$এবং এটি আরও সুসংগত দেখায় আমি এটিকে পছন্দ করি ¹

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

    পরিবর্তে, এটি করার সহজতম উপায় হ'ল প্রথমে আপনার পুরো রেজেেক্সটিকে একক কোটের ভিতরে রেখে দেওয়া 'regex'। একক উদ্ধৃতিটি শেলের উদ্ধৃতিদানের শক্তিশালী রূপ, সুতরাং যতক্ষণ না আপনার রেজেক্সে একক উদ্ধৃতি না থাকে, আপনাকে আর শেল উদ্ধৃতি নিয়ে চিন্তা করতে হবে না এবং খাঁটি BRE বাক্য গঠনতে ফোকাস করতে পারবেন।

সুতরাং, এটি আপনার আসল উদাহরণে ফিরে প্রয়োগ করে আসুন \$Id\$একক উদ্ধৃতিগুলির মধ্যে সঠিক রেজেক্স ( ) নিক্ষেপ করুন । নিম্নলিখিত আপনি যা চান তা করা উচিত:

grep '\$Id\$' my_dir/my_file

কারণ \$Id\$কাজ শেল উদ্ধৃতি অপসারণ (শেল উদ্ধৃত বলার অপেক্ষা রাখে না আরো সঠিক উপায়) প্রয়োগ করা হয় পর, Regex যে কারণ নেই grepদেখতে পাবে না $Id$। (১।) $Idএ বর্ণিত হিসাবে, এই রেজেক্সটি কেবল একটি লাইনের শেষে একটি আক্ষরিক সাথে মেলে কারণ প্রথমটি $আক্ষরিক এবং দ্বিতীয়টি একটি বিশেষ অ্যাঙ্কর চরিত্র।

¹ এও নোট করুন যে আপনি যদি কখনও এক্সটেন্ডেড রেগুলার এক্সপ্রেশন (ERE) এ যান, উদাহরণস্বরূপ যদি আপনি egrep(বা grep -E) ব্যবহার করার সিদ্ধান্ত নিয়ে থাকেন তবে $অক্ষরটি সর্বদা বিশেষ। ইআর এর $Id$কোনও কিছুই কখনই মেলে না কারণ কোনও লাইন শেষ হওয়ার পরে আপনার অক্ষর \$Id\$থাকতে পারে না , তাই যাওয়ার একমাত্র উপায়।


3
গ্রেপ নিয়মিত অভিব্যক্তি হিসাবে এর 1 ম পরামিতিটি ব্যাখ্যা না করার জন্য, আপনি এটিও করতে পারেন grep -F '$Id$'
jfg956

আমার শেল (4.3.42 বাশ) grep '$Id\$' ...এবং grep \$Id\\$ ...কাজের মধ্যে
নিতাস

2
যদি এই একটি Makefile একটি কমান্ড, এছাড়াও আপনি অব্যাহতি আবশ্যক $পূর্ববর্তী সঙ্গে $: grep '$$Id\$$'stackoverflow.com/a/2382810/2097284
ক্যামিল Goudeseune

-2

$Id$একটি ফাইল অনুসন্ধান করতে: আপনি ব্যবহার করতে পারেন:grep '\$id*' filename


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