টি এল; ডিআর:
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
এছাড়াও, file
1 থেকে 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