टी एल; डॉ:
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
एक फ़ाइल है जिसे यह दिखाने के लिए डिज़ाइन किया गया है कि UTF-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
वह (अधिकांश व्यावहारिक उद्देश्यों के लिए) संपूर्ण फ़ाइल है। पूरी तरह से वैध पात्रों को दिखाने के लिए बहुत अच्छी तरह से डिज़ाइन की गई फ़ाइल।
परीक्षा
दूसरी फ़ाइल कई बॉर्डर मामलों की पुष्टि करने के लिए डिज़ाइन की गई है कि utf-8 पाठक एक अच्छा काम कर रहे हैं। इसमें कई वर्ण शामिल हैं जो एक 'be' का कारण बनेंगे। लेकिन उपयोग करने के लिए अन्य उत्तर अनुशंसा (चयनित एक) file
इस फ़ाइल के साथ सकल रूप से विफल हो जाती है। केवल एक शून्य बाइट ( \0
) (जो तकनीकी रूप से मान्य ASCII है) और एक \x7f
बाइट (DEL - हटाएं) (जो स्पष्ट रूप से एक 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
UTF-8 एन्कोडेड पाठ का पता लगाने और रिपोर्ट करने में सक्षम है:
$ echo "ééakjfhhjhfakjfhfhaéá" | file -
/dev/stdin: UTF-8 Unicode text
इसके अलावा, file
1 से 31 की सीमा में ASCII के अधिकांश नियंत्रण वर्णों के रूप में रिपोर्ट करने में विफल रहता है। यह ( 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
Utf-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
हां, यह एक यूनिकोड कैरेक्टर 'रिप्लेसमेंट चार्ज' (U + FFFD) है । यह एक ऐसा चरित्र है जिसका उपयोग पाठ में पाए जाने वाले किसी भी अमान्य यूनिकोड चरित्र को बदलने के लिए किया जाता है । यह एक "दृश्य सहायता" है, वास्तविक चरित्र नहीं। प्रत्येक पूर्ण पंक्ति को खोजने और सूचीबद्ध करने के लिए जिसमें अमान्य UNICODE वर्ण हैं:
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
एक बहुत बड़ा प्रदर्शन सुधार है)।