আমি কীভাবে এই ফাইলটির জন্য বা এটি (2 জিনিস) গ্রিপ করতে পারি?


37

আমার কাছে একটি ফাইল রয়েছে যা "তারপরে" এবং "সেখানে" রয়েছে।

আমি পারি

$ grep "then " x.x
x and then some
x and then some
x and then some
x and then some

এবং আমি পারি

$ grep "there " x.x
If there is no blob none some will be created

আমি কীভাবে উভয়কে এক ক্রিয়াকলাপে অনুসন্ধান করতে পারি? আমি চেষ্টা করেছিলাম

$ grep (then|there) x.x

-বাশ: অপ্রত্যাশিত টোকেনের কাছে সিনট্যাক্স ত্রুটি `('

এবং

grep "(then|there)" x.x
durrantm.../code
# (Nothing)

উত্তর:


53

আপনাকে এক্সপ্রেশনটি উদ্ধৃতি চিহ্নগুলিতে রাখতে হবে। আপনি যে ত্রুটিটি পাচ্ছেন তা বাশকে (একটি বিশেষ চরিত্র হিসাবে ব্যাখ্যা করার ফলাফল ।

এছাড়াও, আপনাকে বাড়ানো নিয়মিত এক্সপ্রেশন ব্যবহার করতে গ্রেপকে বলতে হবে।

$ grep -E '(then|there)' x.x

প্রসারিত নিয়মিত অভিব্যক্তি ছাড়াই আপনাকে , এবং |, এড়িয়ে চলতে হবে । মনে রাখবেন যে আমরা এখানে একক উদ্ধৃতি চিহ্ন ব্যবহার করি। বাশ বিশেষভাবে ডাবল উদ্ধৃতি চিহ্নের মধ্যে ব্যাকস্ল্যাশগুলি আচরণ করে।()

$ grep '\(then\|there\)' x.x

এই ক্ষেত্রে গ্রুপিংয়ের প্রয়োজন নেই।

$ grep 'then\|there' x.x

এটি এর মতো কোনও কিছুর জন্য প্রয়োজনীয় হবে:

$ grep 'the\(n\|re\)' x.x

3
এছাড়াও দেখুন grep $'then\nthere'এবং grep -e then -e there। নোট করুন যে \|বিআরই তে আদর্শ নয়। বাকি আছে। বিশেষভাবে উদ্ধৃতি চিহ্ন মধ্যে ব্যাশ একইরূপে ব্যাকস্ল্যাশ শুধুমাত্র সামনে ", $, \ , `এবং সম্পর্কে newline।
স্টাফেন চেজেলাস

1
এর উদ্দেশ্য কী x.x?
অ্যালেক্স

7

মাত্র একটি দ্রুত সংযোজন, বেশিরভাগ স্বাদে এগ্রিপ নামে একটি কমান্ড থাকে যা -E এর সাথে গ্রেপ হয়। আমি ব্যক্তিগতভাবে টাইপ করতে অনেক বেশি পছন্দ করি

egrep "i(Pod|Pad|Phone)" access.log

গ্রেপ-ই ব্যবহার করার চেয়ে বেশি


2

(বা কমপক্ষে, আমার) ম্যান পৃষ্ঠাতে নিয়মিত এক্সপ্রেসশনের অধীনে নথিভুক্ত জিনিসগুলি আসলে বর্ধিত রেজেক্সপের জন্য;

গ্রেপ নিয়মিত এক্সপ্রেশন সিনট্যাক্সের তিনটি পৃথক সংস্করণ বোঝে: "বেসিক," "এক্সটেন্ডেড" এবং "পার্ল।" জিএনইউ গ্রেপ-তে, বেসিক এবং বর্ধিত বাক্য গঠনগুলির মধ্যে উপলব্ধ কার্যকারিতার মধ্যে কোনও পার্থক্য নেই। অন্যান্য বাস্তবায়নে, বেসিক নিয়মিত এক্সপ্রেশনগুলি কম শক্তিশালী। নিম্নলিখিত বিবরণ বর্ধিত নিয়মিত অভিব্যক্তিগুলিতে প্রযোজ্য; প্রাথমিক নিয়মিত প্রকাশের জন্য পার্থক্যগুলি পরে সংক্ষিপ্ত করা হয়।

তবে গ্রেপ এগুলি ডিফল্টরূপে ব্যবহার করে না - আপনার -Eসুইচটি দরকার :

grep "(then|there)" x.x

কারণ (আবার ম্যান পৃষ্ঠা থেকে):

বেসিক বনাম বর্ধিত নিয়মিত অভিব্যক্তি

মৌলিক নিয়মিত প্রকাশে মেটা-অক্ষর?, +, {, |, (, এবং) তাদের বিশেষ অর্থ হারাতে পারে; পরিবর্তে ব্যাকস্ল্যাশড সংস্করণগুলি \?, +, {, \ |, (এবং) ব্যবহার করুন।

সুতরাং আপনি এটি ব্যবহার করতে পারেন:

grep "then\|there" x.x

যেহেতু প্রথম বন্ধনীগুলি এক্ষেত্রে অতিরিক্ত প্রয়োজন।


0

বাশের মার্জিত সরলতাটি বিশাল ম্যান পৃষ্ঠাতে হারিয়ে গেছে বলে মনে হচ্ছে।

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


দ্রষ্টব্য: শেল স্ক্রিপ্ট লাইনগুলি সরাসরি ব্যবহৃত হয়। টাইপ করা ইনপুট-লাইনগুলি প্রথম ইতিহাস-প্রসারিত।

প্রতিটি বাশ লাইন প্রথমে টোকেনাইজড হয় , বা অন্য কথায় টোকেন বলা হয় যা কাটা । (ব্রেস, টিলড, প্যারামিটার, কমান্ড, পাটিগণিত, প্রক্রিয়া, শব্দ বিভাজন এবং ফাইলের নাম প্রসারণ সহ অন্যান্য সমস্ত বিস্তারের আগে টোকেনাইজিংয়ের ঘটনা ঘটে))

এখানে একটি টোকেন অর্থ ইনপুট লাইনের একটি অংশকে আলাদা করা (সীমিত) এই বিশেষ মেটা-অক্ষরগুলির মধ্যে একটি দ্বারা:

space,  - White space...
tab, 
newline,

‘<’,    - Redirection & piping...
‘|’, 
‘>’
‘&’,    - And/Both < | > | >>  .or.  &<file descriptor>

‘;’,    - Command termination

‘(’,    - Subshell, closed by -     ‘)’

বাশ অন্যান্য অনেকগুলি বিশেষ অক্ষর ব্যবহার করে তবে কেবল এই 10 টি প্রাথমিক টোকেন উত্পাদন করে।

তবে এই মেটা-চরিত্রগুলি মাঝে মাঝে একটি টোকেনের মধ্যেও ব্যবহার করা উচিত, তাদের বিশেষ অর্থটি সরিয়ে নেওয়ার একটি উপায় থাকা দরকার। একে বলা হয় পলায়ন। পলায়নপরকিন্তু হয়, (অর্থাত এক বা একাধিক অক্ষর একটি স্ট্রিং মূল্য উদ্ধৃতি দ্বারা পারেন সম্পন্ন 'xx..', "xx.."), অথবা ব্যাক-স্ল্যাশ, (অর্থাত সঙ্গে একটি পৃথক চরিত্র prefixing দ্বারা \x)। (এটি এর চেয়ে কিছুটা জটিল) কারণ উদ্ধৃতিগুলিও উদ্ধৃত করা দরকার, এবং কারণ ডাবল উদ্ধৃতিগুলি সমস্ত কিছু উদ্ধৃত করে না, তবে এই সরলীকরণটি আপাতত তা করবে)

অন্যান্য ভাষার মতো টেক্সটের একটি স্ট্রিং উদ্ধৃত করার ধারণার সাথে বাশের উদ্ধৃতিটিকে গুলিয়ে ফেলবেন না। বাশ-এর ​​উদ্ধৃতিগুলির মধ্যে যা রয়েছে তা স্ট্রিং নয়, বরং ইনপুট লাইনের যে অংশগুলিতে মেটা-অক্ষর রয়েছে তা পালিয়ে গেছে যাতে তারা টোকেনগুলি সীমিত না করে।

দ্রষ্টব্য, 'এবং এর মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য রয়েছে "তবে এটি অন্য দিনের জন্য।

অবশিষ্ট অপরিবর্তিত মেটা-অক্ষরগুলি তারপরে টোকেন বিভাজক হয়ে যায়।

উদাহরণ স্বরূপ,

$ echo "x"'y'\g
xyg

$ echo "<"'|'\>
<|>

$ echo x\; echo y
x; echo y

প্রথম উদাহরণে একটি স্পেস ডিলিমিটার দ্বারা উত্পাদিত দুটি টোকেন রয়েছে: echoএবং xyz

একইভাবে ২ য় উদাহরণে।

তৃতীয় উদাহরণটি সেমিকোলন পলান হয়, তাই 4 একটি স্থান বিভেদক, দ্বারা উত্পাদিত টোকেন হয় echo, x;, echo, এবং y। প্রথম টোকেনটি তখন কমান্ড হিসাবে চালিত হয় এবং পরবর্তী তিনটি টোকেন ইনপুট হিসাবে নেয়। নোট 2 ম echoকার্যকর করা হয় না।


গুরুত্বপূর্ণ বিষয় মনে রাখা পলায়নের অক্ষরের জন্য যে ব্যাশ প্রথম দেখায় ( ', ", এবং \), এবং তারপর unescaped মেটা-চরিত্র বিভেদক জন্য দেখায়, যাতে।

যদি পালানো না হয় তবে এই 10 টি বিশেষ অক্ষর tokenসীমানা হিসাবে কাজ করে । তাদের মধ্যে কিছুগুলির অতিরিক্ত অর্থও রয়েছে তবে প্রথম এবং সর্বাগ্রে তারা টোকেন ডিলিমিটার।


গ্রেপ কি আশা করে

ইন, grep উপরোক্ত উদাহরণে এই টোকেন প্রয়োজন, grep, string, filename

প্রশ্নের প্রথম চেষ্টাটি ছিল:

p গ্রেপ (তারপরে | সেখানে) xx

এই ক্ষেত্রে (, )এবং |unescaped মেটা অক্ষর এবং তাই এই টোকেন মধ্যে ইনপুট বিভক্ত করতে পরিবেশন করা: grep, (, then, |, there, ), এবং x.x। , grep দেখতে চায় grep, then|thereএবং x.x

প্রশ্নের দ্বিতীয় চেষ্টাটি ছিল:

গ্রেপ "(তারপরে | সেখানে)" এক্সএক্স

এই মধ্যে tokenizes grep, (then|there), x.x। আপনি যদি প্রতিধ্বনির জন্য গ্রিপ বদল করেন তবে আপনি এটি দেখতে পারেন:

প্রতিধ্বনি "(তারপরে | সেখানে)" xx
(তারপরে | সেখানে) xx

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