নিয়মিত এক্সপ্রেশন ভিএস ফাইলের নাম গ্লোববিং


15

আমি জানি যে নিয়মিত এক্সপ্রেশনটি কেবল অক্ষর এবং স্ট্রিংয়ের সাথেই ব্যবহার করতে হয় তবে কখনও কখনও আমি সেগুলি ফাইলগুলির নামে পাই। আমার প্রশ্ন হ'ল: রেজিক্সগুলি কেবল অক্ষরের সাথে বা ফাইলের নাম সহও ব্যবহৃত হয়?

উত্তর:


19

নিয়মিত এক্সপ্রেশন এবং ফাইলের নাম গ্লোববিং দুটি খুব আলাদা জিনিস।

পাঠ্যের সাথে প্যাটার্ন মিলের জন্য নিয়মিত এক্সপ্রেশন কমান্ড / ফাংশনে ব্যবহৃত হয়। উদাহরণস্বরূপ grep, প্রোগ্রামিং ভাষার প্যারামিটারে বা।

ফাইলের নাম গ্লোববিং শেল দ্বারা ফাইল এবং ডিরেক্টরিগুলির নামের সাথে ওয়াইল্ডকার্ড ব্যবহার করে ব্যবহৃত হয়। গ্লোব্বিংয়ের ক্ষমতা শেলের উপর নির্ভর করে। উদাহরণস্বরূপ, বাশ ওয়াইল্ডকার্ডগুলিকে সমর্থন করে:

  • * 0 বা ততোধিক অক্ষর মেলে
  • ? মিল 1 অক্ষর
  • [...] নির্দিষ্ট সেট একটি অক্ষর মেলে

এই ওয়াইল্ডকার্ডগুলি নিয়মিত অভিব্যক্তির অনুরূপ দেখতে পারে, [...]গ্লোব্বিং এবং রেজেক্সে প্রকৃত একই অর্থ রয়েছে। কিন্তু *এবং ?গ্লোব্বিং এবং রেজেক্সে বিভিন্ন জিনিস বোঝাতে।

একটি মন্তব্যে আপনি লিখেছেন:

তবে দোভাষীর পার্থক্য কীভাবে * এটি জোকার বা রেইজেক্স কিনা? উদাহরণস্বরূপ: grep a*b a*.txt?

সহজ। প্রকার, রকম.

প্রথমত, শেলটি ফাইলের সাথে মিল রেখে ওয়াইল্ডকার্ডগুলি ব্যাখ্যা করার চেষ্টা করে। যদি "এ" দিয়ে শুরু করে "বি" দিয়ে শেষ হয় এমন ফাইলগুলি রয়েছে, শেলটি a*bমিলে যাওয়া ফাইলের নামের সাথে প্রতিস্থাপন করবে । একই জন্য যায় a*.txt। যদি কোনও মিলে যাওয়া ফাইলের নাম না থাকে, শেলটি আর্গুমেন্টগুলি grepযেমনটি ছিল তেমনভাবে অক্ষরে পাঠিয়ে দেবে।

তবে এর প্রথম প্যারামিটারটি grepএকটি প্যাটার্ন হওয়া উচিত। ব্যবহারিক ব্যবহারের 99.999% ক্ষেত্রে আপনি প্রথম পরামিতিটি শেল দ্বারা ব্যাখ্যা করতে চান না। সম্ভবত সম্ভবত উদ্দেশ্যটি ছিল:

grep "a*b" a*.txt

উদ্ধৃত করার জন্য ধন্যবাদ a*b, শেলটি গ্লোববিং ব্যবহার করে এটি ব্যাখ্যা করবে না, এবং এর পরিবর্তে সরাসরি এটিকে দেবে grep। পরিবর্তে, grepএটি নিয়মিত প্রকাশ হিসাবে (ডিজাইনের মাধ্যমে) ব্যাখ্যা করবে।

এটির সংক্ষিপ্তসার হিসাবে, শেলটি কমান্ড লাইনটির নিজস্ব গ্লোব্বিং ভাষা অনুসরণ করে যা ওয়াইল্ডকার্ড ব্যবহার করছে তা ব্যাখ্যা করে। কমান্ডস, প্রোগ্রামগুলি তাদের পরামিতিগুলি তাদের লেখকরা যেভাবে ডিজাইন করেছিলেন সেভাবে ব্যাখ্যা করে।


4

যদি কোনও ফাইলনাম আপনার জন্য স্ট্রিং হয় তবে আপনি ফাইলের নামগুলির জন্যও রেজিেক্স ব্যবহার করতে পারেন। উদাহরণস্বরূপ: আপনি যদি একটি রেজেক্সের সাথে মেলে ফাইলের নামগুলি খুঁজতে চান তবে আপনি চেষ্টা করতে পারেন:

find ./ -regex '.*[abc][xyz].*'

কমান্ডটি এমন ফাইলগুলির সন্ধান করবে যেগুলির নামে x, y বা z এর পরে a, b বা c রয়েছে। এটি কেবল একটি উদাহরণ। অন্তহীন সম্ভাবনাময় আছে।


তবে দোভাষীর পার্থক্য কীভাবে * এটি জোকার বা রেইজেক্স কিনা? উদাহরণস্বরূপ: $ গ্রেপ এ "অ্যাসেরিক্স" বি এ "অ্যাসেরিক্স" t টেক্সট
হামজা

2
আপনি যদি ব্যবহার করেন তবে find ./ -name 'a*'* ওয়াইল্ডকার্ড হিসাবে ব্যবহার করুন। আপনি টাইপ করার সময় find ./ -regex 'a*', আপনি একটি রেজিজেমে * ব্যবহার করেন। গুরুত্বপূর্ণ পার্থক্যটি হ'ল সুইচ -nameবা -regex
কেউ কিছু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.