টি এল; ডিআর:
grep -axv '.*' out.txt
দীর্ঘ উত্তর
উভয় উপস্থিত উত্তর অত্যন্ত বিভ্রান্তিকর এবং মূলত ভুল।
পরীক্ষা করতে, এই দুটি ফাইল পান (অত্যন্ত সম্মানিত বিকাশকারী: মার্কাস কুহানের কাছ থেকে):
$ wget https://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-demo.txt
$ wget https://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt
ডেমো
প্রথমটি UTF-8-demo.txtইউটিএফ -8 বিভিন্ন ভাষা, গণিত, ব্রেইল এবং অন্যান্য অনেক দরকারী ধরণের অক্ষর উপস্থাপন করতে সক্ষম হয় তা দেখানোর জন্য ডিজাইন করা একটি ফাইল। একটি পাঠ্য সম্পাদক (যা utf-8 বুঝতে পারে) এর সাথে একবার দেখুন এবং আপনি প্রচুর উদাহরণ দেখতে পাবেন এবং না � ।
এই পরীক্ষার একটি উত্তর প্রস্তাব করে: চরিত্রের সীমাটি সীমাবদ্ধ করতে \x00-\x7Fএই ফাইলটির অভ্যন্তরে প্রায় সমস্ত কিছুই প্রত্যাখ্যান করবে।
এটি খুব ভুল এবং যে কোনও ফাইলকে অপসারণ করা হবে না �কারণ সেই ফাইলটিতে নেই ।
এই উত্তরে প্রস্তাবিত পরীক্ষাটি ব্যবহার করা 72.5 %ফাইলটি সরিয়ে ফেলবে :
$ grep -oP "[^\x00-\x7F]" UTF-8-demo.txt | tr -d '\n' | wc -c
10192
$ cat UTF-8-demo.txt | wc -c
14058
এটি (বেশিরভাগ ব্যবহারিক উদ্দেশ্যে) সম্পূর্ণ ফাইল। পুরোপুরি বৈধ অক্ষরগুলি দেখানোর জন্য খুব ভালভাবে ডিজাইন করা একটি ফাইল।
পরীক্ষা
দ্বিতীয় ফাইলটি ইউটিএফ -8 পাঠকরা একটি ভাল কাজ করছেন তা নিশ্চিত করার জন্য কয়েকটি সীমান্ত ক্ষেত্রে চেষ্টা করার জন্য ডিজাইন করা হয়েছে। এটিতে অনেকগুলি অক্ষর রয়েছে যা একটি ' ' দেখানোর কারণ হতে পারে। তবে ব্যবহারের জন্য অন্য উত্তরের প্রস্তাবনা (নির্বাচিত একটি) fileএই ফাইলটির সাথে পুরোপুরি ব্যর্থ। কেবল একটি শূন্য বাইট ( \0) যা প্রযুক্তিগতভাবে বৈধ ASCII বৈধ) এবং একটি \x7fবাইট (দেল - মুছুন) অপসারণ করলে (যা স্পষ্টতই একটি ASCII অক্ষরও হয়) কমান্ডের জন্য সমস্ত ফাইলকে বৈধ করে তুলবে file:
$ cat UTF-8-test.txt | tr -d '\0\177' > a.txt
$ file a.txt
a.txt: Non-ISO extended-ASCII text, with LF, NEL line terminators
নয় fileসনাক্ত করতে ব্যর্থ অনেক ভুল অক্ষর, কিন্তু সনাক্ত এবং প্রতিবেদন এটি একটি UTF-8 এনকোড ফাইল যে ব্যর্থ হয়।
এবং হ্যাঁ, fileইউটিএফ -8 এনকোডযুক্ত পাঠ্যটি সনাক্ত এবং প্রতিবেদন করতে সক্ষম:
$ echo "ééakjfhhjhfakjfhfhaéá" | file -
/dev/stdin: UTF-8 Unicode text
এছাড়াও, file1 থেকে 31 ব্যাপ্তির বেশিরভাগ নিয়ন্ত্রণের অক্ষরকে ASCII হিসাবে রিপোর্ট করতে ব্যর্থ হয়েছে It এটি ( file) কিছু রেঞ্জের প্রতিবেদন করেছে data:
$ printf '%b' "$(printf '\\U%x' {1..6})" | file -
/dev/stdin: data
অন্যদের হিসাবে ASCII text:
$ printf '%b' "$(printf '\\U%x' 7 {9..12})" | file -
/dev/stdin: ASCII text
মুদ্রণযোগ্য চরিত্রের সীমা হিসাবে (নতুন লাইনের সাথে):
$ printf '%b' "$(printf '\\U%x' {32..126} 10)" | file -
/dev/stdin: ASCII text
তবে কিছু রেঞ্জের কারণে অদ্ভুত ফলাফল হতে পারে:
$ printf '%b' "$(printf '\\U%x' {14..26})" | file -
/dev/stdin: Atari MSA archive data, 4113 sectors per track, starting track: 5141, ending track: 5655
প্রোগ্রামটি fileপাঠ্য সনাক্ত করার কোনও সরঞ্জাম নয়, তবে এক্সিকিউটেবল প্রোগ্রাম বা ফাইলগুলিতে যাদু সংখ্যা সনাক্ত করতে।
ব্যাপ্তিগুলি fileসনাক্ত করে এবং আমি যে অনুরূপ প্রকারের প্রতিবেদন করেছি তা হ'ল:
একটি বাইট মান, বেশিরভাগ আসকি:
{1..6} {14..26} {28..31} 127 :data
{128..132} {134..159} :Non-ISO extended-ASCII text
133 :ASCII text, with LF, NEL line terminators
27 :ASCII text, with escape sequences
13 :ASCII text, with CR, LF line terminators
8 :ASCII text, with overstriking
7 {9..12} {32..126} :ASCII text
{160..255} :ISO-8859 text
উত -8 এনকোডেড রেঞ্জ:
{1..6} {14..26} {28..31} 127 :data
27 :ASCII text, with escape sequences
13 :ASCII text, with CR, LF line terminators
8 :ASCII text, with overstriking
7 {9..12} {32..126} :ASCII text
{128..132} {134..159} :UTF-8 Unicode text
133 :UTF-8 Unicode text, with LF, NEL line terminators
{160..255} :UTF-8 Unicode text
{256..5120} :UTF-8 Unicode text
একটি সম্ভাব্য সমাধান নীচে রয়েছে।
পূর্ববর্তী উত্তর
আপনি যে চরিত্রটি পোস্ট করছেন তার ইউনিকোড মানটি হ'ল:
$ printf '%x\n' "'�"
fffd
হ্যাঁ, এটি একটি ইউনিকোড চরিত্র 'রিপ্লেসমেন্ট চরিত্র' (ইউ + এফএফএফডি) । এটি পাঠ্যটিতে পাওয়া কোনও অবৈধ ইউনিকোড অক্ষর প্রতিস্থাপন করতে ব্যবহৃত একটি অক্ষর । এটি একটি "ভিজ্যুয়াল এইড", বাস্তব চরিত্র নয়। অবৈধ ইউনিকোডে অক্ষরযুক্ত প্রতিটি পূর্ণ লাইন সন্ধান এবং তালিকাবদ্ধ করতে:
grep -axv '.*' out.txt
তবে আপনি যদি কেবল কোনও অক্ষরই অবৈধ কিনা তা সনাক্ত করতে চান তবে ব্যবহার করুন:
grep -qaxv '.*' out.txt; echo $?
ফলাফলটি যদি 1ফাইলটি পরিষ্কার থাকে তবে অন্যথায় শূন্য হবে 0।
আপনি যদি যা জিজ্ঞাসা করছিলেন তা হ'ল: �চরিত্রটি কীভাবে সন্ধান করতে হয় , তবে এটি ব্যবহার করুন:
➤ a='Basically, if the file "out.txt" contains "�" anywhere in the file I'
➤ echo "$a" | grep -oP $(printf %b \\Ufffd)
�
অথবা যদি আপনার সিস্টেমটি সঠিকভাবে UTF-8 পাঠ্য প্রক্রিয়া করে, কেবল:
➤ echo "$a" | grep -oP '�'
�
grepদীর্ঘক্ষণ ইউনিকোড বোঝে (যা এটি অনেক ধীর করে তোলে, তাই এসকি স্ট্রিংগুলি অনুসন্ধান করার জন্য,LANG=C grepএটি একটি বিশাল কর্মক্ষমতা উন্নতি) is