বাশ-এ দ্বৈত অক্ষর সন্ধানের জন্য নিয়মিত প্রকাশ


10

আমি একটি নিয়মিত অভিব্যক্তি খুঁজছি যা কমান্ড লাইনে (ব্যাশ) কোনও পাঠ্যে, একটি তালিকা ইত্যাদিতে ডাবল অক্ষরের সমস্ত উপস্থিতি খুঁজে পায়।

মূল প্রশ্ন : মত সিকোয়েন্স জন্য চেহারা একটি সহজ উপায় আছে কি aa, ll, ttttt, ইত্যাদি যেখানে এক সংজ্ঞায়িত একটি রেগুলার এক্সপ্রেশন যে সঙ্গে একই চরিত্রের এন occurences জন্য কেমন লাগে? আমি যা খুঁজছি তা খুব প্রাথমিক স্তরে এটি অর্জন করা। কমান্ড লাইনে। একটি লিনাক্স শেল এ।

বেশ কিছু গবেষণার পরে আমি নিম্নলিখিত উত্তরগুলিতে এসেছি - এবং সেগুলি থেকে প্রাপ্ত প্রশ্নগুলি, এইভাবে তারা আমাকে সমাধানের সমাধান হতে পারে এমন একটি ইঙ্গিত দিয়েছিল। কিন্তু:

ক) (ঙ) গ্রেপ এবং ব্যাকস্ল্যাশ ইস্যু

  • grep 'a\{2\}' খুজে aa
  • egrep'a{2}' খুজে aa

প্রশ্ন: ব্যাকল্যাশ স্থাপনের প্রয়োজনীয়তাটি কি আমি যে কমান্ডটি ব্যবহার করি তাতে আবদ্ধ? যদি তা হয় তবে এখানে (ঙ) গ্রেপ ব্যবহারের সময় আমাকে আর কী কী বিবেচনায় নিতে হবে তা কি কেউ আমাকে ইঙ্গিত দিতে পারে?

খ) আমি আমার প্রশ্নের জন্য এই উত্তরটি এখানে পেয়েছি , যদিও এটি আমি যা খুঁজছিলাম ঠিক তা নয়:

grep -E '(.)\1' filenameএকই চরিত্রের একাধিকবার উপস্থিত হওয়ার জন্য এন্ট্রিগুলি সন্ধান করে তবে কতবার জিজ্ঞাসা করে না । এটি আমি যা খুঁজছি তার কাছাকাছি, তবে আমি এখনও অনেকগুলি পুনরাবৃত্তি সেট করতে চাই।

আমার সম্ভবত এটি দুটি বা ততোধিক প্রশ্নের মধ্যে বিভক্ত করা উচিত, তবে তারপরে আমি এই দুর্দান্ত সাইটটি এখানে প্লাবিত করতে চাই না।

দ্রষ্টব্য: আরেকটি প্রশ্ন হলো, সম্ভবত বিষয়ে বন্ধ কিন্তু: এটা in, inside, atবা on the shell। এবং on the command lineসঠিক?

উত্তর:


8

এটি সত্যিই দুটি প্রশ্ন, এবং বিচ্ছেদ হওয়া উচিত ছিল। তবে যেহেতু উত্তরগুলি তুলনামূলকভাবে সহজ, আমি সেগুলি এখানে রাখব। এই উত্তরগুলি grepবিশেষত জিএনইউর জন্য।

ক) egrepহিসাবে একই grep -E। উভয়ই নির্দেশ করে যে "বর্ধিত নিয়মিত এক্সপ্রেশন" ব্যবহার করা উচিত grep'এর ডিফল্ট নিয়মিত অভিব্যক্তিগুলির পরিবর্তে । grepসরল নিয়মিত অভিব্যক্তিগুলির জন্য ব্যাকস্ল্যাশগুলির প্রয়োজন।

manপৃষ্ঠা থেকে :

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

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

manHistoricalতিহাসিক সম্মেলন এবং বহনযোগ্যতা সম্পর্কে অতিরিক্ত তথ্যের জন্য পৃষ্ঠাটি দেখুন ।

খ) আপনি বিয়োগফলটি প্রতিস্থাপন করতে চান এমন সংখ্যার সাথে ব্যবহার করুন egrep '(.)\1{N}'এবং প্রতিস্থাপন করুন N(যেহেতু বিন্দুটি প্রথমটির সাথে মেলে)। সুতরাং আপনি যদি একটি চরিত্রের সাথে চারবার পুনরাবৃত্তি করতে চান তবে ব্যবহার করুন egrep '(.)\1{3}'


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

এটি বেশ বিভ্রান্তিকর পড়া " সর্বদা ব্যাকস্ল্যাশ ব্যবহার করে যেমন।, + ইত্যাদি ইত্যাদি চরিত্রগুলির কাছ থেকে বিশেষ অর্থ গ্রহণ করতে " এবং তারপরে এটি সুনির্দিষ্টভাবে জানা যায় যে সর্বাধিক প্রাথমিক কমান্ডের সাথে বিপরীতটি সম্ভবত বিপরীত।
21 এ 17

@ cellar.dweller এটি বিভ্রান্তিকর! অনেক যুক্তি isতিহাসিক। তাই আমি সবসময় শুধু ব্যবহারের একটি অভ্যাসে পরিণত আমি এক্সটেন্ডেড ফর্ম সঙ্গে আরো পরিচিত নই egrepআমি যদি রেগুলার এক্সপ্রেশনের হবে (শুধু সহজ স্ট্রিং ম্যাচিং উল্টোদিকে) আমি মধ্যে পার্থক্য মনে সম্পর্কে চিন্তা করতে হবে না, যাতে grepএর দুই নিয়মিত এক্সপ্রেশন ধরণের।
ছাড়ুন

4
নোট করুন যে স্ট্যান্ডার্ড ERE গুলি ব্যাক-রেফারেন্সগুলিকে সমর্থন করে না, যখন স্ট্যান্ডার্ড বিআরইগুলি করে। সুতরাং grep '\(.\)\1\{3\}'মান, grep -E '(.)\1{3}'না।
স্টাফেন চেজেলাস

7

এটি একই চরিত্রের 2 বা ততোধিক উপস্থিতির সন্ধান করবে:

grep -E '(.)\1+' file

যদি আপনার অ্যাডক-এর বিকল্পটি থাকে তবে এটি প্রতিটি মিলকে একটি নতুন লাইনে মুদ্রণ করবে ..

grep -Eo '(.)\1+' file

ঠিক 3 টি ম্যাচের সাথে ম্যাচগুলি সন্ধান করতে:

grep -E '(.)\1{2}' file

বা 3 বা আরও:

grep -E '(.)\1{2,}' file

ইত্যাদি ..


সম্পাদন করা

আসলে @ স্টাফেন_চাজেলাস পিছনের তথ্যসূত্র এবং -E সম্পর্কে সঠিক। আমি এটা ভুলে গিয়েছিলাম। আমি বিএসডি গ্রেপ এবং জিএনইউ গ্রেপ এ চেষ্টা করেছি এবং এটি সেখানে কাজ করে তবে এটি অন্য কোনও গ্রেপের ক্ষেত্রে নেই। আপনি নীচের সংস্করণ ব্যবহার করতে হবে ..

নিয়মিত গ্রেপ সংস্করণ:

grep '\(.\)\1\{1,\}' file

grep -o '\(.\)\1\{1,\}' file

grep '\(.\)\1\{2\}' file

grep '\(.\)\1\{2,\}' file

-oবিকল্পটি মান, grep BTW নয় (সম্ভবত যদি আপনার, grep বুঝতে পারে -o এটি আগের উল্লেখ করতে পারেন) ..


দ্রষ্টব্য : অ্যালেক্সিস নির্দেশিত হিসাবে grep -E '(.)\1{2,}'ফাইল এবং grep '\(.\)\1\{2\}'ফাইল ভুল এবং এড়ানো উচিত ..


আপনাকে ধন্যবাদ, এখন পর্যন্ত। কিন্তু: আমি কি ঠিক বলছি যে বিকল্পটি ছাড়া খুব বেশি কিছু হবে না? -Egrepএটি বেশ কিছু ব্যাখ্যা করবে, উদাহরণস্বরূপ কেন আমি কোথায় ভুল ছিল তা সন্ধান করতে আমি এত সময় নষ্ট করলাম!
erch

-E বিকল্প ব্যতীত +আপনিও এই ক্ষেত্রে একই কাজ করতে পারেন তবে আপনাকে আরও পালাতে হবে এবং কোনও অপারেটর নেই .. আমি উদাহরণও পোস্ট করব।
স্ক্রুটিনাইজার 5

একটি ছোট সংশোধন: grep -E '(.)\1{2}'হুবহু "3 টি মিলের সাথে ম্যাচগুলি সন্ধান করুন"। এটি ঠিক তিনটি অভিন্ন চরিত্রের সাথে মিলবে , তারা দীর্ঘ পুনরাবৃত্তি স্ট্রিং এ এম্বেড করা যেতে পারে; উদাহরণস্বরূপ, এটি 5-চিহ্নের স্ট্রিংয়ে মিলবে AAAAA। (এবং যদি এখানে 6 বা ততোধিক প্রতীক থাকে তবে এটি একাধিকবার মিলবে)।
Alexis

হ্যাঁ আপনি একেবারে ঠিক বলেছেন, এটি যেমন ইচ্ছা তেমন কাজ করে না, আসলে এটি এর মতো সম্ভব নয় ..
স্ক্রুটিনাইজার

3

প্রথমে আপনার সমর্থনমূলক মন্তব্য এবং পরামর্শের জন্য আপনাকে সবাইকে ধন্যবাদ জানাই। দেখা যাচ্ছে যে আমি ইতিমধ্যে উত্তরের খুব কাছাকাছি ছিলাম।

প্রধান সমস্যাটি সম্পর্কে ছিল:

একই অক্ষরের এন উপস্থিতিগুলি সন্ধান করার জন্য কি কোনও সহজ উপায় আছে , যেমন aa,tttttt

সংক্ষিপ্ত উত্তর :

নিম্নলিখিত [পরিবর্তনের] কমান্ডগুলি aকমপক্ষে এক এবং অসীম বার পুনরাবৃত্তি করবে

grep 'a\{1,}

grep -E \(a\)\{1,\}

egrep a{1,}

বা, জিএনইউ নিয়মিত এক্সপ্রেশন পাওয়া যায় grep a\+


Repeatings সংখ্যা, প্যাটার্ন মাধ্যমে কোঁকড়া বন্ধনী ভিতরে নির্ধারণ করা হয় {min,max}{n}পুনরাবৃত্তি ঠিক nসময়ে, {n,}অন্তত পুনরাবৃত্তি nকাল ও {n,m}অন্তত পুনরাবৃত্তি nকিন্তু সর্বাধিক mবার।

সুতরাং, ফলস্বরূপ, গৌণ সমস্যা উত্থাপিত :

ব্যাকল্যাশ সেট করার প্রয়োজনীয়তাটি আমি যে কমান্ডটি ব্যবহার করি তা বাধ্য?

সংক্ষিপ্ত উত্তর : হ্যাঁ, ব্যাকস্ল্যাশ ব্যবহার কিনা একটি ব্যবহার উপর নির্ভর করে grepবাegrep

  • grep: ব্যাকস্ল্যাশ মেটাচার্যাক্টরকে সক্রিয় করে [বেসিক নিয়মিত অভিব্যক্তি ব্যবহার করে]
  • egrepব্যাকস্ল্যাশ ডি- অ্যাক্টিভেটেড মেটাচার্যাক্টর [বর্ধিত নিয়মিত এক্সপ্রেশন ব্যবহার করে]

যেহেতু এটি সংক্ষিপ্ত উত্তর, আমি যারা তুলনামূলক সমস্যাগুলিতে ছড়িয়ে পড়েছি তাদের সরবরাহ করতে চাই, আমি আমার বুনিয়াদি সংক্ষিপ্তসারটি যুক্ত করেছিলাম যার মধ্যে কারও কাছে মনে হয় সচেতন হওয়া উচিত, তার সাথে কাজ করা grepএবং egrep




বেসিক, প্রসারিত এবং জিএনইউ নিয়মিত এক্সপ্রেশন

বেসিক নিয়মিত এক্সপ্রেশন

ইন grep, edএবং sedকমান্ড ব্যবহৃত হয়

বেসিক নিয়মিত এক্সপ্রেশন সেট বৈশিষ্ট্যগুলি হ'ল:

  • বেশিরভাগ মেটাচার্যাক্টর, যেমন ? [ . \ )ইত্যাদি ব্যাকস্ল্যাশের মাধ্যমে সক্রিয় হয়। যদি কোনও ব্যাকস্ল্যাশ না থাকে তবে তারা অনুসন্ধান শব্দটির অংশ হিসাবে নেওয়া হবে।
  • ^ $ \<এবং \>ব্যাকস্ল্যাশ ছাড়াই সমর্থিত
  • কোন সাধারণভাবে সংক্ষেপে অক্ষর [ \b, \sইত্যাদি]

জিএনইউ বেসিক নিয়মিত এক্সপ্রেশনগুলি এগুলিকে যুক্ত করে

  • \?অক্ষর পুনরাবৃত্তি শূন্য বা এক সময় ( c\?ম্যাচ cএবং cc) এবং এটি একটি বিকল্প\{0,1\}
  • \+একটি অক্ষর অন্তত একটি সময় (পুনরাবৃত্তি c\+ম্যাচ cc, ccccccccইত্যাদি) এবং এর জন্য একটি বিকল্প নেই\{1,\}

  • \|সমর্থিত (যেমন grep a\|bসন্ধান করবে aবাb

grep -E প্রসারিত নিয়মিত এক্সপ্রেশনগুলির পুরো সেটটি ব্যবহার করতে কমান্ডকে সক্ষম করে:


প্রসারিত নিয়মিত এক্সপ্রেশন [ERE]

ব্যবহৃত egrep, awkএবং emacsবেসিক সেট প্লাস বেশ কিছু বৈশিষ্ট্য আছে।

  • মেটাচার্যাক্টরগুলি ব্যাকস্ল্যাশের মাধ্যমে নিষ্ক্রিয় হয়
  • পিছনে কোনও রেফারেন্স নেই
  • অন্যথায়: নিয়মিত এক্সপ্রেশনগুলির যাদুগুলি প্রচুর যাদু করতে পারে

GNU প্রসারিত নিয়মিত এক্সপ্রেশন

নিম্নলিখিত বৈশিষ্ট্য যুক্ত করে

দুটি লিঙ্ক একটিকে নিয়মিত-এক্সপ্রেশন.আইনফোতে পরিচালিত করবে যা আমি এখানে পেয়েছি এমন দুর্দান্ত সমর্থন ছাড়াও সত্যই আমাকে অনেক সাহায্য করেছে।

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