সঠিক রেজিএক্স গ্রেপ এ কাজ করছে না


13

আমার এই রেজেক্স আছে:

(?<=prefix).*$

যা "উপসর্গ" এরপরে যে কোনও অক্ষরকে প্রদান করে এবং এটি কোনও অনলাইন রেজেক্স ইঞ্জিনগুলিতে সূক্ষ্মভাবে কাজ করে (যেমন https://regex101.com )। সমস্যাটি হ'ল আমি যখন ব্যাশে এই রেজেক্সটি ব্যবহার করি:

grep '(?<=prefix).*$' <<< prefixSTRING

এটি কিছু মেলে না। কেন সেই রেজেক্স গ্রেপের সাথে কাজ করে না?


11
এটি সত্যই হাইলাইট করে যে কেন রেজিএক্স 101 এর জন্য জেএস, পার্ল / পিএইচপি এবং পাইথনের জন্য যেমন পসিক্স ফ্লেভার নির্বাচনকারী প্রয়োজন। আমি এটির জন্য কতবার চেয়েছি তা গণনা করতে পারছি না।
জ্যারেড স্মিথ


এছাড়াও, .*$কেবল কোনও একটি অক্ষর নয়, শেষ-অব-লাইনের (বা-স্ট্রিং-এর) অবধি যে কোনও স্ট্রিং মেলে।
ilkkachu

উত্তর:


38

আপনি সঠিক রেজেক্স সংজ্ঞায়িত করেছেন বলে মনে হয়, তবে grepএটি বোঝার জন্য কমান্ড-লাইনে পর্যাপ্ত পতাকাগুলি সেট করেন নি । কারণ ডিফল্টরূপে grepBRE সমর্থন করে এবং -Eপতাকা সহ এটি পূর্বে হয়। আপনার যা আছে (চেহারা-পূর্বের) কেবলমাত্র পিসিআরই রেজেক্স ফ্লেভারে উপলব্ধ যা grepএটির -Pপতাকা সহ কেবল জিএনইউতে সমর্থিত ।

আপনি ধরে নেওয়া যাক দরকার বের করে আনতে শুধুমাত্র ম্যাচিং স্ট্রিং পরে prefixআপনি একটি অতিরিক্ত পতাকা যোগ করতে হবে -oদিন জানি grepযে মুদ্রণ শুধুমাত্র ম্যাচিং অংশ

grep -oP '(?<=prefix).*$' <<< prefixSTRING

grepডিফল্টরূপে পিসিআরই লাইব্রেরিগুলিকে সমর্থন করে এমন একটি সংস্করণ রয়েছে - pcregrepযা আপনি কেবলমাত্র করতে পারেন

pcregrep -o '(?<=prefix).*$' <<< prefixSTRING

বিভিন্ন রেগেক্স স্বাদ সম্পর্কে বিস্তারিত ব্যাখ্যা এই বিস্ময়কর গাইলসের উত্তর এবং সরঞ্জামগুলিতে ব্যাখ্যা করা হয়েছে যা তাদের প্রতিটি বাস্তবায়ন করে


38

নিয়মিত প্রকাশগুলি বিভিন্ন স্বাদে আসে। আপনি যা দেখাচ্ছে তা পার্লের মতো নিয়মিত এক্সপ্রেশন (পিসিআরই, "পার্ল সামঞ্জস্যপূর্ণ নিয়মিত এক্সপ্রেশন")।

grepPOSIX নিয়মিত প্রকাশ করে। এগুলি হ'ল বেসিক নিয়মিত এক্সপ্রেশন (বিআরই) এবং বর্ধিত নিয়মিত এক্সপ্রেশন (ইআরই, বিকল্পের grepসাথে ব্যবহার করা হয় -E)। জন্য ম্যানুয়াল দেখুন re_formatবা regexবা যাই হোক না কেন অনুরূপ ম্যানুয়াল আপনারgrep ম্যানুয়াল আপনার সিস্টেম, অথবা POSIX মান গ্রন্থে যে আমি শুধু লিঙ্ক উপর বোঝায়।

আপনি যদি জিএনইউ ব্যবহার করেন grep, আপনি যদি grepজিএনইউ- grepস্পেসিফিকের সাথে ব্যবহার করেন তবে পার্লের মতো নিয়মিত এক্সপ্রেশন ব্যবহার করতে সক্ষম হবেন-P বিকল্পটি ।

এছাড়াও নোট করুন যে ডিফল্টরূপে লাইনগুলিgrep দেয়, লাইনগুলি থেকে সাবস্ট্রিংগুলি নয়। আবার, জিএনইউ grep(এবং কিছু অন্যান্য grepবাস্তবায়ন) এর সাহায্যে আপনি -oপ্রতিটি লাইন থেকে প্রদত্ত এক্সপ্রেশনটির সাথে মেলে এমন বিট (গুলি) পেতে বিকল্পটি ব্যবহার করতে পারেন ।

মনে রাখবেন যে উভয়ই -Pএবং -oএর POSIX স্পেসিফিকেশনgrep অ-মানক এক্সটেনশান ।

আপনি যদি জিএনইউ ব্যবহার না করে থাকেন grepতবে তার sedপরিবর্তে আপনি স্ট্রিং prefixএবং লাইনের শেষের মধ্যে কিছুটা পেতে পারেন :

sed -n 's/.*prefix\(.*\)/\1/p' file

এটি যা করে কেবলমাত্র সেই লাইনগুলি মুদ্রণ করা sedযা প্রদত্ত প্রতিস্থাপন প্রয়োগ করতে পরিচালিত করে। প্রতিস্থাপনের সাথে মেলে পুরো লাইনটি প্রতিস্থাপন করবে (যা একটি বিআরই), স্ট্রিংয়ের পরে ঘটে যাওয়া অংশটির সাথে prefix

মনে রাখবেন যে যদি prefixকোনও লাইনে একাধিক উদাহরণ থাকে তবে sedতারতম্যটি শেষের পরে স্ট্রিংটি ফিরিয়ে আনবে , অন্যদিকে GNU grepপ্রকরণটি প্রথমটির পরে স্ট্রিংটি ফিরে আসবে (এর মধ্যে অন্যান্য উদাহরণগুলি অন্তর্ভুক্ত থাকবে)prefix )।

sedসমাধান সব ইউনিক্স-সদৃশ সিস্টেম পোর্টেবল হবে।


6

অন্যান্য উত্তরগুলি যেমনটি বলেছে, grepলুকবিহিন্ডগুলি (জিএনইউর সাথে ডিফল্টরূপে) সাথে একটি রেগেক্স গন্ধ ব্যবহার করে নাgrep , বা অন্য সংস্করণগুলির সাথে মোটেও নয়) ।

আপনি যদি নিজেকে জিএনইউ ব্যবহার করতে অক্ষম বলে মনে করেন grepবা আপনার কাছে এটি pcregrepব্যবহার করতে পারেন perl

কমান্ড লাইনটি সমান perlহবে:

perl -ne 'print if /(?<=prefix).*$/' <<< prefixSTRING

আপনি স্ল্যাশের মধ্যে কাঙ্ক্ষিত রেজেক্স রেখেছেন। আপনি যেহেতু পার্ল ব্যবহার করছেন, এটি পার্লের রেজেক্স স্বাদ ব্যবহার করে


বা print "$&\n" if ...যদি তারা কেবল অংশটি আউটপুট করতে চায়prefix
ইলক্কাচু
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.