গ্রেপ ব্যবহার করে একটি নির্দিষ্ট সংখ্যক অক্ষরের সাথে স্ট্রিংয়ের মিল


9

আমি সমস্ত 6অক্ষরের শব্দ ব্যবহার করে সন্ধান করার চেষ্টা করছি grep। আমার বর্তমানে এটি রয়েছে:

grep "^.\{6\}$" myfile.txt 

তবে, আমি সন্ধান করছি যে আমি ফলাফলগুলিও পাচ্ছি যেমন: étuis, étude

আমার সন্দেহ eহয় উপরের শব্দগুলির সাথে উপরের চিহ্নগুলির সাথে এটির কিছু আছে ।

এটি যাতে না ঘটে তা নিশ্চিত করার জন্য আমি কি কিছু করতে পারি?

আপনার সাহায্যের জন্য ধন্যবাদ!

উত্তর:


4

grepএকটি চরিত্রের ধারণা স্থানীয়-নির্ভর । যদি আপনি কোনও অ-ইউনিকোড লোকালে থাকেন এবং আপনি কোনও ইউনিকোড অক্ষরযুক্ত একটি ফাইল থেকে গ্রেপ করেন তবে অক্ষরটির সংখ্যা মেলে না। আপনি যদি echo $LANGতখন থাকেন তবে আপনি যে লোকালটি রয়েছেন তা দেখতে পাবেন।

আপনি যদি ".UTF-8" দিয়ে শেষ হওয়া কোনও মানটিতে LC_CTYPEএবং / অথবা LANGপরিবেশের ভেরিয়েবলগুলি সেট করেন তবে আপনি সঠিক আচরণ পাবেন:

$ cat data
étuis
letter
éééééé
$ LANG=C grep -E '^.{6}$' data
étuis
letter
$ LANG=en_US.UTF_8 grep -E '^.{6}$' data
letter
éééééé
$

কমান্ডের মতো একই লাইনে ভেরিয়েবল নির্ধারণ করে আপনি কেবল একটি কমান্ডের জন্য আপনার স্থানীয় অবস্থান পরিবর্তন করতে পারেন।

এই কনফিগারেশনের মাধ্যমে, বহু-বাইট অক্ষরগুলি একক অক্ষর হিসাবে বিবেচিত হয়। আপনি যদি পুরোপুরি ASCII অক্ষরগুলি পুরোপুরি বাদ দিতে চান তবে অন্যান্য উত্তরের কয়েকটিতে আপনার সমাধান রয়েছে।


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


আপনি যদি ব্যবহার করেন তবে এর .মতো কিছু wăsd'sমিলবে
cuonglm

'এমন একটি চরিত্র যা যুক্তিসঙ্গতভাবে "নির্দিষ্ট সংখ্যক অক্ষরযুক্ত স্ট্রিং" এর অংশ হতে পারে।
মাইকেল হোমার

হতে পারে. এবং আপনার উভয় সেট করা উচিত LC_CTYPEএবং এর LANGমতো কিছু LC_CTYPE=en_US.UTF-8 LANG=en_USব্যর্থ হবে। LC_ALLসুরক্ষার জন্য ব্যবহার করুন ।
cuonglm

2

এটা চেষ্টা কর:

LC_ALL=C.UTF-8 grep -x '[_[:alnum:]]\{6\}' file

-xপুরো লাইন মেলে ব্যবহার করুন, এবং POSIX (দেখুন দ্বারা সংজ্ঞায়িত , grep )।

কী করে তার ভাল ব্যাখ্যার জন্য এখানে দেখুন LC_ALL। একই আচরণ পেতে আপনি সেট LANGবা LC_CTYPEutf-8 ব্যবহার করতে পারেন। আদেশটি প্রভাবিত করছে LC_ALL=> LANG=> LC_CTYPE


2

grepপিসিআরই সহায়তায় তৈরি হলে জিএনইউ দিয়ে আপনি এটি করতে পারেন:

grep -Px '\X{6}'

যদিও .ম্যাচ একটি অক্ষর, \Xএকটি নিশান / graphem সাথে মেলে।

একটি ইউটিএফ -8 লোকালে:

$ locale charmap
UTF-8
$ printf '\u00e9tuis\n\u00e9tudes\n' | grep -Px '\X{6}'
études
$ printf 'e\u0301tuis\ne\u0301tudes\n' | grep -Px '\X{6}'
études

পরবর্তীকালে étudesএখানে 7 টি অক্ষর, 8 বাইট এবং 6 গ্রাফি রয়েছে।


দেখে মনে হচ্ছে এটি কার্যকর হয় না: echo épée | grep -Px '\X{6}'আউটপুটépée
কিউনগ্লাম

@ জ্ঞাক, আপনার এটি ইউটিএফ -8 লোকালে চালানো দরকার (যদি উপরেরগুলি ইউটিএফ -8 éএ এনকোড করা থাকে)।
স্টাফেন চেজেলাস

ওহ, আমার ভুল এটি ইউটিএফ -8 এর সাথে কাজ করে।
cuonglm

0

আপনি এরকম কিছু চেষ্টা করতে পারেন:

grep "^[A-Za-z]\{6\}$" myfile.txt

বা যদি শব্দগুলির মধ্যে সংখ্যাগুলিও থাকতে পারে তবে:

grep "^[A-Za-z0-9]\{6\}$" myfile.txt

এগুলি ছাড়াও আপনি চান বর্গক্ষেত্র বন্ধনীতে কেবল কোনও অক্ষর যুক্ত করুন।


এটি মোটেও মেলে না étude, কারণ অ্যাকসেন্টের সাথে সম্পর্কিত ASCII চরিত্রটি রিজেক্সকে বিশৃঙ্খলা করবে।
অ্যালেক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.