আপনার লোকেলের চরিত্রের এনকোডিং (যা দিয়ে আপনি বলতে পারবেন locale charmap
) এটি চরিত্র প্রতি একাধিক বাইট।
আজকাল সর্বাধিক সাধারণ ইউটিএফ -8 হ'ল অক্ষরগুলি 1 থেকে 4 বাইটের বেশি এনকোড করা যায়। বাইটগুলির সমস্ত ক্রমগুলি ইউটিএফ -8 এ বৈধ অক্ষর তৈরি করে না। ইউটিএফ -8 এর প্রতিটি অ-এসসিআইআই চরিত্রটি একটি বাইট দিয়ে শুরু হয় যেখানে দুটি সর্বোচ্চ বিট সেট রয়েছে এবং কতগুলি বাইট সর্বোচ্চ (তবে দ্বিতীয় সর্বোচ্চ নয়) বিট সেট অনুসরণ করে তা জানান with
/dev/urandom
বাইটস এলোমেলো স্ট্রিম রয়েছে। tr
অক্ষরকে লিখিতভাবে লিপিবদ্ধ করে, সুতরাং এটির জন্য সেই বাইটগুলি অক্ষর হিসাবে ডিকোড করা দরকার। আপনার পরিসীমাতে থাকা এএসসিআইআই অক্ষরগুলি সমস্ত ইউটিএফ -8-তে একটি অক্ষরে এনকোড করা আছে, তবে tr
এখনও সমস্ত অক্ষর ডিকোড করা দরকার। উদাহরণস্বরূপ অন্যান্য বহু-বাইট এনকোডিং রয়েছে যেখানে A
0x41 বাইট (কোডের জন্য A
) ব্যতীত কিছু অক্ষর রয়েছে ।
কারণ বাইটের এলোমেলো স্ট্রিমটি অবৈধ সিকোয়েন্সগুলিকে আবদ্ধ করতে বাধ্য (উদাহরণস্বরূপ, নিজে থেকে 0x80 বাইটটি ইউটিএফ -8 এ অবৈধ, কারণ একটি নন-এসসিআইআই অক্ষর একটি বাইটের সাথে শুরু করতে হবে যে 0xc1 (0xc0 এবং 0xc1 কোনও ইউটিএফ- তে নেই 8 টি অক্ষর)), সুতরাং tr
যখন ঘটে তখন একটি ত্রুটি নিয়ে ফিরে আসে।
আপনি এখানে যা চান তা হ'ল বাইটের স্ট্রিমটিকে এনকোডিংয়ের অক্ষর হিসাবে বিবেচনা করা হবে যার প্রতি অক্ষরে প্রতি বাইট রয়েছে। আপনি নির্বাচন যেটা আপনার সীমার মধ্যে সব গুরুত্বপূর্ণ যারা অক্ষর নয় (মত জেড দ্বারা অভিমানী, আপনি বোঝানো ABCDEFGHIJKLMNOPQRSTUVWXYZ এবং জিনিষ Ý
, Ê
) পোর্টেবল অক্ষর সেট তাই সব আপনার সিস্টেমে সমর্থিত ক্যারেক্টার-সেট একই এনকোড করা অংশ।
যে জন্য, আপনি সেট চাই LC_CTYPE
স্থানীয়করণ পরিবর্তনশীল যা এক সিদ্ধান্ত নেয় যা অক্ষরসেট ব্যবহার করা হয় এবং কি ভালো জিনিস হয় blank
, alpha
চরিত্র শ্রেণীর ধারণ করে। তবে এজেড সীমার সংজ্ঞা দেওয়ার জন্য আপনি LC_COLLATE
ভেরিয়েবলটি সেট করতে চান (স্ট্রিং ক্রম সংক্রমণের সিদ্ধান্ত নেয় এমনটি)।
C
ওরফে POSIX
লোকেল এক একক বাইট যে নিশ্চয়তা অক্ষর এবং জেড ABCDEFGHIJKLMNOPQRSTUVWXYZ হয়। আপনি করতে পারেন:
LC_CTYPE=C LC_COLLATE=C tr -dc 'A-Za-z0-9_!@#$%^&*()+=-'
(এখানে -
শেষ দিকে সরানো , অন্যথায়, এর )-+
মতো পরিসীমা হিসাবে নেওয়া হবে A-Z
)
কিন্তু মনে রাখবেন যে LC_ALL
পরিবর্তনশীল সব অন্যান্য অগ্রাহ্য LC_*
এবং LANG
ভেরিয়েবল। সুতরাং, যদি LC_ALL
অন্যথায় ইতিমধ্যে সংজ্ঞায়িত করা হয় তবে উপরের কোনও প্রভাব থাকবে না। সুতরাং পরিবর্তে আপনি সহজভাবে করতে পারেন:
LC_ALL=C tr -dc 'A-Za-z0-9_!@#$%^&*()+=-'
এটি ত্রুটি বার্তাগুলির ভাষার মতো অন্য জিনিসগুলিকে প্রভাবিত করবে, তবে যাইহোক, এলসি_সিটিওয়াইপি পরিবর্তন করা ইতিমধ্যে ত্রুটি বার্তাগুলির জন্য সমস্যা হতে পারে (উদাহরণস্বরূপ, সি লোকেলের অক্ষরে রুশ বা জাপানি ত্রুটি বার্তা প্রকাশ করার কোনও উপায় নয়)।
xargs
...