কেন রেডেক্স অক্ষর হিসাবে ব্যাখ্যা করার জন্য আমার সেডে রেজেক্স অক্ষরগুলি পালাতে হবে?


11

মনে হয় যেমন নিয়মিত ভাব প্রকাশের জন্য
cat sed_data.txt | sed 's/\b[0-9]\{3\}\b/NUMBER/g'
আমাকে অক্ষরগুলি থেকে পালাতে হবে । এক্ষেত্রে বেশ কয়েকবার ব্যাখ্যা করার জন্য আমাকে ব্রেসগুলি এড়িয়ে চলতে হয়েছিল।
কেন? আমি আশা করছিলাম যে পালাতে না পারলে সবকিছুই একটি রেজেক্স চরিত্র হবে be অর্থাৎ বিপরীত।


ভিমে অনুসন্ধান সম্পর্কে একটি পোস্ট ছিল যা কিছুটা এই প্রশ্নকে অন্তর্ভুক্ত করে, সংক্ষিপ্ত সংস্করণটি হ'ল এটি "কমান্ডের প্রয়োগের উপর নির্ভর করে" ... unix.stackex
بدل.

@ ড্রাভস্লোয়ান: আমি নিশ্চিত নই যে এটি একইরকম default আমি আপনাকে ডিফল্টরূপে পাঠ্য অনুসন্ধান করি এবং রেগেক্সের সন্ধান করতে আপনাকে পালাতে হবে this তবে এই ক্ষেত্রে ফর্ম্যাটটি s/regex//gইতিমধ্যে একটি রেজেক্সের প্রত্যাশা করেছে এবং আমি প্রত্যাশা করব যে এটি পাঠ্যের প্রয়োজন হবে পালাতে হবে
জিম

উত্তর:


14

এ কারণে যে sedব্যবহারসমূহ POSIX BREs (বেসিক রেগুলার এক্সপ্রেশন) হিসেবে Eres উল্টোদিকে (রেগুলার এক্সপ্রেশন প্রসারিত) আপনি সম্ভবত পার্ল বা বন্ধুদের কাছ থেকে ব্যবহার করছি।

থেকে sed(1)মানুষ পৃষ্ঠা:

REGULAR EXPRESSIONS
       POSIX.2 BREs should be supported, but they aren't completely because of
       performance problems.  The \n sequence in a regular expression  matches
       the newline character, and similarly for \a, \t, and other sequences.

উপরের লিঙ্ক থেকে প্রাসঙ্গিক উক্তি:

বেসিক রেগুলার এক্সপ্রেশন বা বিআরই ফ্লেভারটি .তিহ্যবাহী ইউএনআইএক্স গ্রেপ কমান্ড দ্বারা ব্যবহৃত স্বাদের অনুরূপ স্বাদকে মানীকৃত করে। এটি এখনও বেশিরভাগ প্রাচীন নিয়মিত অভিব্যক্তি গন্ধ যা আজও ব্যবহৃত হয়। এই স্বাদটি আলাদা করে দেয় এমন একটি জিনিস হ'ল মেটাচারাকে তার স্বাদ দেওয়ার জন্য বেশিরভাগ মেটাচ্যাকার্টারের একটি ব্যাকস্ল্যাশ প্রয়োজন। পসিক্স ইআর-সহ বেশিরভাগ অন্যান্য স্বাদগুলি মেটাচার্যাক্টারের অর্থ দমন করতে ব্যাকস্ল্যাশ ব্যবহার করে।

ক্রেগ স্যান্ডার্সের মন্তব্য থেকে উদ্ধৃত শব্দবাচক :

নোট করুন যে GNU সেডে কমপক্ষে, আপনি সেডকে -r বা --regexp- এক্সটেন্ডেড কমান্ড লাইন বিকল্পের সাহায্যে এক্সটেন্ডেড রিজেক্সপ্স ব্যবহার করতে বলতে পারেন। আপনি যদি অতিরিক্ত পালানোর সাথে সাথে নিজের এসিড স্ক্রিপ্টটি কৃপণতা এড়াতে চান তবে এটি কার্যকর।


1
লক্ষ্য করুন গনুহ অন্তত কিন্তু, আপনার সাথে বর্ধিত regexps ব্যবহার করতে sed বলতে পারেন -rবা --regexp-extendedকমান্ড লাইন বিকল্প। আপনি যদি অতিরিক্ত পালানোর সাথে সাথে নিজের এসিড স্ক্রিপ্টটি কৃপণতা এড়াতে চান তবে এটি কার্যকর।
ক্যাস

@ ক্রেইগস্যান্ডার্স এর জন্য ধন্যবাদ। উত্তর যুক্ত করা হয়েছে।
জোসেফ আর।

@ ক্রেইগস্যান্ডার্স, অন্যান্য sedবাস্তবায়ন (যখন তারা ইআরইগুলি সমর্থন করে, বেশিরভাগ বিএসডি হয়) -Eতার পরিবর্তে (যা অনেক বেশি তাৎপর্যপূর্ণ কারণ এটি একই বিকল্প হিসাবে তৈরি করে G grepকেন জিএনইউ sedবেছে নিয়েছিল -rতা আমার কাছে একটি রহস্য।)।
স্টাফেন চেজেলাস

হ্যাঁ, আমার কাছেও একটি রহস্য। এটি-ই ব্যবহার করে আরও বোধগম্য হবে। এবং তারপরে GNU গ্রেপের সাথে মেলে -F, -G, এবং -P যুক্ত করুন। আইএমও গাওক একই আরআরোগুলি থেকেও উপকৃত হবে ... বা কমপক্ষে, -পি।
ক্যাস

12

এটি historicalতিহাসিক কারণে।

ed70 এর দশকের গোড়ার দিকে ইউজিতে প্রথমে রিজেপেক্স চালু হয়েছিল । যদিও edওপর ভিত্তি করে qedযার বাস্তবায়ন একই লেখক দ্বারা আরো জটিল regexp বোঝা, edশুধুমাত্র বোঝা ^, $, [...], ., *এবং \উপরের সব অব্যাহতি।

এখন, যখন আরও বেশি অপারেটর থাকার দরকার হয়েছিল, পশ্চাদপদ সামঞ্জস্যতা না ভেঙে তাদের পরিচয় করানোর জন্য কোনও উপায় খুঁজে বের করতে হয়েছিল। একটি স্ক্রিপ্ট ব্যবহার করতে ব্যবহার করে থাকেন s edকমান্ড হিসাবে s/foo() {/foo (var) {/gসমস্ত উদাহরণ প্রতিস্থাপন foo() {সঙ্গে foo(var) { এবং আপনি একটি চালু (বা {অপারেটর, যে স্ক্রিপ্ট ভঙ্গ করবে।

তবে কোনও স্ক্রিপ্ট করবে না s/foo\(\) {/foo\(var\) {/, কারণ এটি একই রকম s/foo() {/foo(var) {/এবং (রেই অপারেটর না হওয়ায় পালানোর কোনও কারণ ছিল না। সুতরাং কোনও নতুন \(বা \{অপারেটর প্রবর্তন পিছনের সামঞ্জস্যতা ভঙ্গ করে না কারণ এটি পুরানো বাক্য গঠন ব্যবহার করে কোনও বিদ্যমান স্ক্রিপ্ট ভাঙার খুব কমই সম্ভাবনা।

সুতরাং, যে কি করা হয়েছিল। পরে, \(...\)প্রাথমিকভাবে কেবলমাত্র s edকমান্ডের মতো s/foo\(.\)/\1bar/এবং পরে grep '\(.\)\1'( যেমনটি পছন্দ মতো জিনিস নয় \(xx\)*) করার জন্য যুক্ত করা হয়েছিল।

ইউনিক্সভি 7 (1979, সুতরাং প্রায় এক দশক পরে), নিয়মিত এক্সপ্রেশনগুলির একটি নতুন রূপকে নতুন egrepএবং awkইউটিলিটিগুলিতে বর্ধিত নিয়মিত এক্সপ্রেশন বলে যুক্ত করা হয়েছিল (যেহেতু তারা নতুন সরঞ্জাম, তাই কোনও পিছনে সামঞ্জস্যতা ভাঙার দরকার নেই)। শেষ অবধি , এটি কেন টম্পসনের প্রাচীন qed(অল্টারনেশন অপারেটর |, গ্রুপিং (..)*) এ উপলব্ধ কার্যকারিতা সরবরাহ করেছিল এবং কয়েকটি অপারেটর যুক্ত করেছে +এবং ?(তবে বেসিক নিয়মিত প্রকাশের ব্যাকরেফ বৈশিষ্ট্য নেই)।

পরে বিএসডি যোগ করা হয় \<এবং \>(বিআরই এবং ইআরই উভয়) \{এবং \}এসআইএসভি কেবলমাত্র বিআরইতে যুক্ত হয়।

এটি এর পরে খুব বেশি আগে হয়নি {এবং পূর্বের }সাথে যুক্ত হয়েছিল, যেমন ভাঙা পশ্চাৎ সামঞ্জস্যতা দ্বারা by সবাই এটি যুক্ত করে না। উদাহরণস্বরূপ, জিএনইউ POSIX কনফরমেশন মোডে বাধ্য awkনা করা পর্যন্ত সংস্করণ 4.0.0 (2011) অবধি সমর্থন করে {না।

grepনব্বইয়ের দশকের গোড়ার দিকে যখন জিএনইউ লেখা হয়েছিল, তখন এটি বিএসডি এবং সিএসভি উভয়ের (যেমন \<, {) সমস্ত গুডিকে যুক্ত করেছে এবং বিআরই এবং ইআরইয়ের জন্য দুটি পৃথক রেজিএক্সএক্স সিনট্যাক্স এবং ইঞ্জিনের পরিবর্তে উভয়টিতে একই অপারেটরগুলি প্রয়োগ করেছে, কেবল বিআরই অংশীদারদের (, ?, {, +একটি ব্যাকস্ল্যাশ সঙ্গে পূর্বে করা থাকতে হবে (অন্যান্য BRE বাস্তবায়নের সঙ্গে সামঞ্জস্যপূর্ণ হতে)। এটা কেন আপনি কি করতে পারেন .\+গনুহ মধ্যে grep(যদিও যে POSIX নয় বা অন্যান্য বাস্তবায়নের সমর্থন করে) এবং আপনি কি করতে পারেন (.)\1গনুহ মধ্যে egrep(যদিও যে POSIX না বা গনুহ সহ অন্যান্য অনেক বাস্তবায়নের দ্বারা সমর্থিত awk)।

যোগ করার পদ্ধতি \xঅপারেটার একটি অনগ্রসর সামঞ্জস্যপূর্ণ ভাবে আরো অপারেটার যোগ করার জন্য একমাত্র উপায় নয়। উদাহরণস্বরূপ, perlব্যবহৃত (?...)। যেমন যে এখনও অনগ্রসর Eres সঙ্গে সামঞ্জস্যপূর্ণ (?=...)Eres বৈধ নয়, জন্য একই .*?vimঅনুরূপ অপারেটরগুলির জন্য এটি পরিচয় করিয়ে \@=বা .\{-}উদাহরণস্বরূপ পৃথকভাবে করেছিলেন ।

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