এর জন্য গ্রেপ ব্যবহার করার চেষ্টা করবেন না, পরিবর্তে বিশ্রী ব্যবহার করুন। 2 রিজেেক্সপ্স আর 1 এবং আর 2 কে গ্রেপের সাথে মিলানোর জন্য আপনি ভাবতেন যে এটি হবে:
grep 'R1.*R2|R2.*R1'
অবাক হওয়ার সময় এটি থাকত:
awk '/R1/ && /R2/'
তবে কি যদি R2
ওভারল্যাপ হয় বা একটি উপসেট হয় R1
? অ্যাগ্রক কমান্ড চলাকালীন সেই গ্রেপ কমান্ডটি কার্যকরভাবে কাজ করবে না। বলে লাইন যেগুলিতে খুঁজতে চান করতে দেয় the
এবং heat
:
$ echo 'theatre' | grep 'the.*heat|heat.*the'
$ echo 'theatre' | awk '/the/ && /heat/'
theatre
আপনাকে এর জন্য 2 গ্রেপ এবং একটি পাইপ ব্যবহার করতে হবে:
$ echo 'theatre' | grep 'the' | grep 'heat'
theatre
এবং অবশ্যই যদি আপনি এগুলি পৃথক করার প্রয়োজন পড়ে থাকেন তবে আপনি সর্বদা জাগতে ঠিক একই রেজিএক্সপেক্টে লিখতে পারেন যেমন আপনি গ্রিপ ব্যবহার করেছিলেন এবং এমন বিকল্প বিকল্প সমাধান রয়েছে যা প্রতিটি সম্ভাব্য ক্রমটিতে রেজেক্সপগুলি পুনরাবৃত্তি করার সাথে জড়িত না।
এটিকে একপাশে রেখে, যদি আপনি 3 রেজিক্সএস আর 1, আর 2 এবং আর 3 এর সাথে মিলানোর জন্য আপনার সমাধানটি প্রসারিত করতে চান তবে কি হবে। গ্রেপ ইন যে এই দুর্বল পছন্দগুলির মধ্যে একটি হতে চাই:
grep 'R1.*R2.*R3|R1.*R3.*R2|R2.*R1.*R3|R2.*R3.*R1|R3.*R1.*R2|R3.*R2.*R1' file
grep R1 file | grep R2 | grep R3
অদ্ভুত অবস্থায় এটি সংক্ষিপ্ত, সুস্পষ্ট, সরল, দক্ষ হতে চাই:
awk '/R1/ && /R2/ && /R3/'
এখন, আপনি যদি রিজেক্সপ্স আর 1 এবং আর 2 এর পরিবর্তে আক্ষরিক স্ট্রিং এস 1 এবং এস 2 এর সাথে মিল করতে চান? আপনি কেবল গ্রিপ-এ কল করতে পারবেন না, গ্রিপ কল করার আগে আপনাকে সমস্ত আরই মেটাচার থেকে বাঁচতে কোড লিখতে হবে:
S1=$(sed 's/[^^]/[&]/g; s/\^/\\^/g' <<< 'R1')
S2=$(sed 's/[^^]/[&]/g; s/\^/\\^/g' <<< 'R2')
grep 'S1.*S2|S2.*S1'
অথবা আবার 2 গ্রেপস এবং একটি পাইপ ব্যবহার করুন:
grep -F 'S1' file | grep -F 'S2'
যা আবার দুর্বল পছন্দ যেখানে আপনি ঠিক রেজিএক্সএক্স অপারেটরের পরিবর্তে স্ট্রিং অপারেটর ব্যবহার করেন:
awk 'index($0,S1) && index($0.S2)'
এখন, আপনি যদি একটি লাইনের পরিবর্তে একটি অনুচ্ছেদে 2 রেজিেক্সপগুলি মেলতে চান? গ্রেপ করে করা যায় না, অসভ্য মধ্যে তুচ্ছ:
awk -v RS='' '/R1/ && /R2/'
কিভাবে একটি সম্পূর্ণ ফাইল জুড়ে? আবার গ্রেপ এবং অজস্র ক্ষেত্রে তুচ্ছভাবে করা যাবে না (এই সময় আমি একত্রীকরণের জন্য মাল্টি-চর আরএসের জন্য জিএনইউ অ্যাডকে ব্যবহার করছি তবে এটি কোনও অ্যাডকের বেশি কোড নয় বা আপনি একটি নিয়ন্ত্রণ-চর বেছে নিতে পারেন যা আপনি জানেন না আরএসের মতো করার জন্য ইনপুটটিতে থাকুন):
awk -v RS='^$' '/R1/ && /R2/'
সুতরাং - যদি আপনি কোনও লাইন বা অনুচ্ছেদে বা ফাইলে একাধিক রেজেক্সপস বা স্ট্রিং সন্ধান করতে চান তবে গ্রেপ ব্যবহার করবেন না, awk ব্যবহার করুন।