কি করে \? একটি নিয়মিত অভিব্যক্তি মানে?


16

নিম্নলিখিত কমান্ডটি 7-সংখ্যার ফোন নম্বর অনুসন্ধান করতে ব্যবহৃত হয়:

grep "[[:digit:]]\{3\}[ -]\?[[:digit:]]\{4\}" file

কি \?দাঁড়াবে?

উত্তর:


21

এটি ?অন্যান্য অনেকগুলি নিয়মিত এক্সপ্রেশন ইঞ্জিনের মতো, এবং এর অর্থ "শূন্য বা তার আগে যা কিছু এসেছিল তার সাথে মিলে যায়"।

আপনার উদাহরণে \?এটি প্রয়োগ করা হয় [ -], এর অর্থ এটি কোনও স্থান বা বিয়োগের সাথে মেলে চেষ্টা করে তবে স্থান বা বিয়োগটি isচ্ছিক।

সুতরাং এর যে কোনওটি মিলবে:

555 1234
555-1234
5551234

এর \?চেয়ে বরং এটি লেখার ?পিছনের সামঞ্জস্যের জন্য।

grepব্যবহৃত বিভিন্ন ধরণের নিয়মিত প্রকাশের মূল সংস্করণটিকে "বেসিক রেগুলার এক্সপ্রেশন" বলা হয় যেখানে ?কেবল একটি আক্ষরিক প্রশ্ন চিহ্ন বোঝানো হয়েছিল।

যাতে জিএনইউ গ্রেপের শূন্য বা এক কার্যকারিতা থাকতে পারে, তারা এটিকে যুক্ত করে, তবে \?সিনট্যাক্সটি ব্যবহার করতে হয়েছিল যাতে ব্যবহৃত স্ক্রিপ্টগুলি ?প্রত্যাশার মতো কাজ করে worked

নোট করুন যে গ্রেপের একটি -Eবিকল্প রয়েছে যা এটি আরও সাধারণ ধরণের নিয়মিত অভিব্যক্তি ব্যবহার করে, "বর্ধিত নিয়মিত এক্সপ্রেশন" বলে ions

man 1 grep:

   -E, --extended-regexp
          Interpret PATTERN as an extended regular expression
          (ERE, see below).  (-E is specified by POSIX.)

   -G, --basic-regexp
          Interpret PATTERN as a basic regular expression (BRE, see below).
          This is the default.

...

Repetition
    A regular expression may be followed by one of several repetition operators:
    ?      The preceding item is optional and matched at most once.

...

    grep understands three different versions of regular expression syntax:
    “basic,” “extended” and “perl.”

...

Basic vs Extended Regular Expressions
    In basic regular expressions the meta-characters ?, +, {, |, (, and )
    lose their special meaning; instead use the backslashed versions
    \?, \+, \{, \|, \(, and \).

আরও তথ্য:


egrepকমান্ড সমতূল্য grep -E। জিএনইউ গ্রেপ ব্যতীত অন্যান্য সংস্করণগুলির জন্য বিকল্পটি grepগ্রহণ বা নাও করতে পারে -Eএবং egrepএটি একটি পৃথক প্রোগ্রাম হতে পারে।
কিথ থম্পসন

@ কিথথম্পসন, grep -Eসরকারী পসিক্স উপায়। egrepsusv2 (1997) এ অবমূল্যায়ন করা হয়েছিল এবং POSIX এবং ইউনিক্স স্পেস থেকে susv3 (2001) এ সরানো হয়েছিল।
স্টাফেন চেজেলাস

1
\?যদিও এটি GNUism।
স্টাফেন চেজেলাস

8

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

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

বেশিরভাগ রেইগেক্স বাস্তবায়নে, একটি প্রশ্ন চিহ্নের অর্থ হ'ল পূর্ববর্তী আইটেমটি alচ্ছিক, যখন একজন পালানো প্রশ্ন চিহ্ন (\?) একটি আক্ষরিক প্রশ্ন চিহ্ন। তবে কয়েকটি উপভাষায় এটি অন্যভাবে। আপনার উদাহরণটি উভয় দিক দিয়েই বোধগম্য হতে পারে, তবে আমার সন্দেহ হয় আপনার একটি উপভাষা কোথায় আছে? আক্ষরিক এবং is? theচ্ছিক প্রতীক। সুতরাং আপনার রেজেক্সের সম্ভবত "তিনটি অঙ্ক, বিকল্পের পরে একটি স্থান বা ড্যাশ, তারপরে চারটি অঙ্কের পরে" অর্থ হবে।

(আর একটি সূত্র \ {3 like like এর মতো নির্মানগুলিতে দেখা যায়, যা স্পষ্টভাবে "পূর্ববর্তী আইটেমের ঠিক 3" হিসাবে বোঝানো হয়েছে। বেশিরভাগ রেজেক্স উপভাষায় এটি {3} লেখা হবে, এবং \ a একটি আক্ষরিক বন্ধনী হবে ।)


6

এটি ইতিমধ্যে অন্যান্য উত্তরে থাকা তথ্যের একটি দ্রুত সংক্ষিপ্তসার।

ইন grep, ?একটি আক্ষরিক প্রশ্ন-চিহ্নের চরিত্রের সাথে মেলে এবং \?শূন্য বা এর আগে যা ঘটেছিল তার একটি ঘটনাকে বোঝায়। সুতরাং আপনার প্রশ্নের উদাহরণে, [ -]\?কোনও স্থান, বা হাইফেন, বা কিছুই মিলবে না।

ইন egrepবা grep -E, এটা অন্যান্য উপায় কাছাকাছি এর; \?একটি আক্ষরিক প্রশ্ন চিহ্নের সাথে মেলে এবং ?শূন্য বা একটি ঘটনাকে বোঝায়।

এটি জিএনইউ গ্রেপের ক্ষেত্রে প্রযোজ্য; নন-জিএনইউ গ্রেপ বাস্তবায়নের জন্য বিশদটি কিছুটা আলাদা হতে পারে। বিশেষত, grepএবং egrephistorতিহাসিকভাবে দুটি পৃথক প্রোগ্রাম ছিল এবং আমি মনে করি না পুরানোগুলির বিকল্প grepছিল -E। পসিক্স নির্দিষ্ট করে grep -E, তবে (আমি অবাক হয়ে অবাক হয়েছি) উল্লেখ করেনি egrep

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