কেন '[অজ] *' অ বর্ণানুক্রমিক স্ট্রিংগুলির সাথে মেলে?


9

alphanumএই দুটি লাইন সহ আমার একটি ফাইল রয়েছে:

123 abc
this is a line

আমি দৌড়ে গিয়েছি কেন, যখন আমি দৌড়ান sed 's/[a-z]*/SUB/' alphanum, আমি নিম্নলিখিত আউটপুটটি পাই:

SUB123 abc
SUB is a line

আমি আশা করেছিলাম:

123 SUB
SUB is a line

আমি একটি স্থির (এর sed 's/[a-z][a-z]*/SUB/'পরিবর্তে ব্যবহার ) পেয়েছি , তবে কেন এটি কাজ করে এবং আমার কাজ করে না তা আমি বুঝতে পারি না।

তুমি কি সাহায্য করতে পারো?



@ কমরাজ, এটি একইরকম, তবে শেলের নিদর্শনগুলির তুলনায় বনাম পুনরায় বিভ্রান্তি রয়েছে (এবং উত্তরগুলি পূর্বের দিকে মনোনিবেশ করে, যেহেতু ls foo*সেখানে এটি ব্যবহার করে)। তবে যাইহোক, যদি আপনি ডুপ্লিকেটযুক্ত এমন প্রশ্নগুলি খুঁজে পান তবে আমার মনে হয় আপনার এগুলিও পতাকাঙ্কিত করতে সক্ষম হওয়া উচিত।
ইলকচাছু

খুঁজে বার করো regexr.com লাইভ ভিজ্যুয়াল জন্য & ব্যাখ্যা
RozzA

@ রোজ্জা নোট করুন যে ওয়েবসাইটটির সাথে আপনি লিঙ্ক করেছেন জাভাস্ক্রিপ্ট এবং পার্ল নিয়মিত এক্সপ্রেশন সমর্থন করে, পসিক্স নিয়মিত এক্সপ্রেশন নয়।
কুসালানন্দ

উত্তর:


28

প্যাটার্ন [a-z]*ম্যাচ শূন্য সীমার মধ্যে বা তার বেশি অক্ষরের aথেকে z( প্রকৃত অক্ষর বর্তমান লোকেল উপর নির্ভরশীল)। স্ট্রিংয়ের একেবারে শুরুতে শূন্যের মতো অক্ষর রয়েছে 123 abc(অর্থাত প্যাটার্ন ম্যাচগুলি), এবং তাদের শুরুতে চারটি this is a line

অন্তত প্রয়োজন এক ম্যাচ, তারপর ব্যবহার [a-z][a-z]*বা [a-z]\{1,\}, অথবা বর্ধিত রেগুলার এক্সপ্রেশনের সক্ষম sed -Eএবং ব্যবহার [a-z]+

প্যাটার্নটি কোথায় মেলে তা ভিজ্যুয়ালাইজ করতে প্রতিটি ম্যাচের চারপাশে বন্ধনী যুক্ত করুন:

$ sed 's/[a-z]*/(&)/' file
()123 abc
(this) is a line

বা, সমস্ত ম্যাচগুলি লাইনে দেখার জন্য:

$ sed 's/[a-z]*/(&)/g' file
()1()2()3() (abc)
(this) (is) (a) (line)

শেষ ফলাফলের সাথে তুলনা করুন

$ sed -E 's/[a-z]+/(&)/g' file
123 (abc)
(this) (is) (a) (line)

7
প্রযুক্তিগতভাবে [a-z]মিলিত উপাদানগুলির সাথে মেলে যা একাধিক চরিত্রের তৈরি হতে পারে। উদাহরণস্বরূপ, কিছু হাঙ্গেরিয়ান লোকালে, [a-z]ম্যাচগুলি হয়dzs
স্টাফেন চেজেলাস

12

কারণ *ম্যাচ শূন্য বা তার বেশি পূর্ববর্তী পরমাণুর পুনরাবৃত্তির, এবং সমস্ত Regex ইঞ্জিন প্রথম মিল খুঁজে চেষ্টা করুন। আপনার স্ট্রিংয়ের শুরুতে হুবহু শূন্য অক্ষরের একটি স্ট্রিং রয়েছে, যাতে এটি মিলবে। যে ক্ষেত্রে স্ট্রিংটি একটি অক্ষর দিয়ে শুরু হয়, সেখানে *যতটা সম্ভব তার সাথে মেলে তবে এটি বামতমতম ম্যাচটি খুঁজে পাওয়া গৌণ।

শূন্য দৈর্ঘ্যের মিলগুলি কিছুটা সমস্যাযুক্ত হতে পারে এবং আপনি যেমন দেখেছেন সমাধানটি হ'ল প্যাটার্নটি পরিবর্তন করতে হবে যাতে এর জন্য কমপক্ষে একটি অক্ষর প্রয়োজন। বর্ধিত রেগেক্সস সহ, আপনি তার +জন্য এটি করতে পারেন :sed -E 's/[a-z]+/SUB/'

মজাদার জন্য চেষ্টা করুন:

echo 'less than 123 words' | sed 's/[0-9]*/x/g'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.