मैं सभी गैर-एएससीआईआई पात्रों के लिए कैसे तैयार हूं?


359

मेरे पास कई बहुत बड़ी एक्सएमएल फाइलें हैं और मैं उन लाइनों को खोजने की कोशिश कर रहा हूं जिनमें गैर-एएससीआईआई अक्षर हैं। मैंने निम्नलिखित कोशिश की है:

grep -e "[\x{00FF}-\x{FFFF}]" file.xml

लेकिन यह फ़ाइल में प्रत्येक पंक्ति को लौटाता है, चाहे रेखा में निर्दिष्ट सीमा में कोई वर्ण हो।

क्या मेरे पास वाक्य रचना गलत है या मैं कुछ और गलत कर रहा हूं? मैंने भी कोशिश की है:

egrep "[\x{00FF}-\x{FFFF}]" file.xml 

(पैटर्न के आसपास के सिंगल और डबल कोट्स दोनों के साथ)।


ASCII वर्ण केवल एक बाइट लंबे होते हैं, इसलिए जब तक फ़ाइल यूनिकोड न हो, 0xFF से ऊपर कोई वर्ण नहीं होना चाहिए।
20

हम \ xFF से ऊपर कैसे जाते हैं? Grep एक "grep: वर्ण वर्ग में क्रम से बाहर" त्रुटि देता है।
मुदित जैन

जवाबों:


493

आप कमांड का उपयोग कर सकते हैं:

grep --color='auto' -P -n "[\x80-\xFF]" file.xml

यह आपको लाइन नंबर देगा, और लाल रंग में गैर-एससीआई चार्ट को उजागर करेगा।

कुछ प्रणालियों में, आपकी सेटिंग्स के आधार पर, ऊपर काम नहीं करेगा, इसलिए आप उलटा द्वारा पकड़ सकते हैं

grep --color='auto' -P -n "[^\x00-\x7F]" file.xml

ध्यान दें, कि महत्वपूर्ण बिट -Pध्वज है जो समान है --perl-regexp: तो यह आपके पैटर्न को पर्ल रेगुलर एक्सप्रेशन के रूप में व्याख्या करेगा। यह भी कहता है कि

यह अत्यधिक प्रायोगिक है और grep -P अनिमित सुविधाओं की चेतावनी दे सकता है।


42
यह BSD grep(OS X 10.8 माउंटेन लायन पर) में काम नहीं करेगा , क्योंकि यह Pविकल्प का समर्थन नहीं करता है।
बस्तियान एम। वैन डी वेर्ड

20
मेरी पिछली टिप्पणी को अपडेट करने के लिए, grepहोमबॉव की dupesलाइब्रेरी में जीएनयू संस्करण उपलब्ध है (उपयोग करने में सक्षम brew tap homebrew/dupes):brew install grep
बस्तियान एम। वैन डे वीर्ड

48
@BastiaanVanDeWeerd सही है, OSX 10.8 पर grep अब PCRE ("पर्ल-संगत नियमित अभिव्यक्ति") का समर्थन नहीं करता है क्योंकि डार्विन अब GNU grep के बजाय BSD grep का उपयोग करता है। dupesपुस्तकालय स्थापित करने का एक विकल्प pcreइसके बजाय स्थापित करना है: brew install pcre... इसके भाग के रूप में, आपको pcregrepउपयोगिता मिलेगी , जिसे आप निम्नानुसार उपयोग कर सकते हैं:pcregrep --color='auto' -n "[\x80-\xFF]" file.xml
pvandenberk

15
मैक brewउपयोगकर्ताओं के लिए, जीएनयू के कोर्यूटिल्स के साथ स्थापित किया जा सकता है brew install coreutils। यह आपको 'जी' के साथ उपसर्गित जीएनयू के कई उपकरण देगा - इस मामले में उपयोग ggrep। यह एक सिस्टम उपयोगिता को बदलने से उत्पन्न होने वाली समस्याओं से बचना चाहिए, क्योंकि सिस्टम-विशिष्ट मैक स्क्रिप्ट अब बीएसडी grep पर निर्भर करती है।
जोएल पुर्रा

22
यह एक मैक पर ठीक काम करता है जिसे ag "[\x80-\xFF]" fileआपको बस स्थापित करने की आवश्यकता हैthe_silver_searcher
15

123

गैर-ASCII वर्णों की बाइट श्रेणी के बारे में धारणा बनाने के बजाय, जैसा कि ऊपर दिए गए अधिकांश समाधान करते हैं, इसके बजाय ASCII वर्णों की वास्तविक बाइट श्रेणी के बारे में स्पष्ट होना बेहतर है।

तो उदाहरण के लिए पहला समाधान बन जाएगा:

grep --color='auto' -P -n '[^\x00-\x7F]' file.xml

(जो मूल रूप से हेक्साडेसिमल ASCII रेंज के बाहर के किसी भी वर्ण के लिए क्रेप करता है: \ x00 से \ _7% तक)

माउंटेन लायन पर जो काम नहीं करेगा (BSD grep में पीसीआरई सपोर्ट की कमी के कारण) , लेकिन pcreहोमब्रे के माध्यम से स्थापित होने के साथ , निम्नलिखित भी काम करेगा:

pcregrep --color='auto' -n '[^\x00-\x7F]' file.xml

कोई भी पेशेवरों या विपक्ष जो किसी को भी सोच सकते हैं?


9
यह वास्तव में मेरे लिए काम किया जहां उपरोक्त समाधान विफल रहे। M $ Word एपोस्ट्रोफ़ ढूँढना आसान नहीं रहा है!
अल्बर्टबेलबेल

2
यदि आपके पास बैश-संगत शेल है, लेकिन pcre-grep काम नहीं कर रहा है, तो LC_COLLATE=C grep $'[^\1-\177]'काम करता है (बिना नल बाइट्स के फाइलों के लिए)
idupree

2
यह समाधान ऊपर वाले की तुलना में लगातार काम करने लगता है।
0xcaff

1
मुझे अपनी UTF8 फ़ाइल में कांजी, सिरिलिक और पारंपरिक चीनी को पिक करने के लिए इसका उपयोग करना पड़ा, "[\ x80- \ xFF]" का उपयोग करके ये सभी छूट गए।
buckaroo1177125

1
प्रो इस उत्कृष्ट रूप से काम किया है, जबकि अन्य विकल्प महान थे लेकिन महान नहीं थे। अब तक कोई विपक्ष नहीं मिला।
jwpfox 11

67

निम्नलिखित मेरे लिए काम करता है:

grep -P "[\x80-\xFF]" file.xml

गैर- ASCII वर्ण 0x80 से शुरू होते हैं और बाइट्स को देखते हुए 0xFF पर जाते हैं। Grep (और परिवार) यूनिकोड प्रसंस्करण को मल्टी-बाइट वर्णों को मर्ज करने के लिए एक एकल इकाई में मर्ज करने के लिए नहीं करते हैं जैसा कि आप चाहते हैं। -Pमेरी ग्रेप में विकल्प के उपयोग की अनुमति \xddचरित्र कक्षाओं में पलायन आप क्या चाहते हैं पूरा करने के लिए।


1
यह देखने के लिए कि तुरंत एकाधिक फ़ाइलों पर इसे कॉल करने का तरीका नहीं पता है, बस चलाएं: ढूंढें। -नाम * .xml | xargs grep -P "[\ x80- \ xFF]"
डेविड मोहुंद्रो

1
यह एक मैच लौटाता है, लेकिन कोई संकेत नहीं है कि चरित्र क्या है और यह कहां है। कोई कैसे देखता है कि चरित्र क्या है, और यह कहां है?
फहीम मिठ्ठ

"-N" जोड़ने से लाइन नंबर मिलेगा, इसके अलावा गैर-दृश्यमान वर्ण टर्मिनल पर एक ब्लॉक के रूप में दिखाई देंगे: grep -n -P "[\ x80- \ xFF]" file.xml
fooMonster

4
मुझे हंगुल कोरियाई से समस्या है: echo '소녀시대' | grep -P "[\x80-\xFF]"मेरे लिए कुछ नहीं लौटाता - क्या कोई और पुष्टि कर सकता है? (GNU grep 2.21)
frabjous

@ फ़्रेबूसस यहाँ, लेकिन उलटा काम करता है echo '소녀시대' | grep -P "[^\x00-\x7F]":। या the_silver_searcher@slf द्वारा बताए अनुसार उपयोग करें :echo '소녀시대' | ag "[\x80-\xFF]"
psmith

55

पेरल में

perl -ane '{ if(m/[[:^ascii:]]/) { print  } }' fileName > newFile

1
OSX10.11 पर मुझे इसे खोजने से पहले कई grep + regex समाधान आजमाने पड़े जो वास्तव में काम करता है
sg

उस OSX समाधान @sg साझा करने के लिए देखभाल ?!
जियोथेट्री

ऊपर दी गई पटकथा वह समाधान है जिसके बारे में मैं बात कर रहा हूं
sg

5
perl -lne 'print if /[^[:ascii:]]/' file.xml
नावेद

43

एक गैर-एएससीआईआई चरित्र को परिभाषित करने का आसान तरीका है ... एक ऐसा चरित्र जो एएससीआईआई चरित्र नहीं है।

LC_ALL=C grep '[^ -~]' file.xml

^यदि आवश्यक हो तो टैब जोड़ें ।

स्थापना LC_COLLATE=Cअधिक से अधिक स्थानों में चरित्र पर्वतमाला के अर्थ के बारे बुरा आश्चर्य से बचा जाता है। LC_CTYPE=Cएकल-बाइट वर्णों से मेल खाने के लिए सेटिंग आवश्यक है - अन्यथा वर्तमान एन्कोडिंग में अमान्य बाइट अनुक्रम याद होगा। स्थापना LC_ALL=Cटाल स्थान पर निर्भर प्रभाव पूरी तरह।


RedHat 6.4 पर tcsh के साथ, मुझे <<< env LC_COLLATE = C grep -n '[^ - ~]' file.xml >>> का उपयोग करना था। मैंने लाइन नंबर प्राप्त करने के लिए जोड़ा।
ddevienne

मेरे लिए echo "A" | LC_COLLATE=C grep '[^ -~]'
frabjous

1
@frabjous यदि आपके पास है LC_ALL=en_US.UTF-8, तो LC_COLLATEसेटिंग को ट्रम्प करता है। आप अपने वातावरण में यह नहीं होना चाहिए! LC_ALLकेवल एक विशेष कार्य को आमतौर पर उपयोग करने के लिए बाध्य करना है C। सभी श्रेणियों के लिए डिफ़ॉल्ट लोकल सेट करने के लिए, सेट करें LANG
गिल्स एसओ- बुराई को रोकना '

1
सबसे पहले, मैंने नहीं जोड़ा LC_ALL=C, यह मैक ओएस एक्स और उबंटू पर अलग तरह से व्यवहार करता है। इस सेटिंग को जोड़ने के बाद, वे वही परिणाम देते हैं।
मैक्स पेंग

1
यह एक मैक पर काम करता है, जबकि अन्य grep- आधारित समाधान नहीं करते हैं।
मथायस फ्राइप

26

यहाँ एक और संस्करण है जो मैंने पाया कि स्वीकृत उत्तर के लिए grep खोज से पूरी तरह से अलग परिणाम उत्पन्न हुए हैं [\x80-\xFF]। शायद यह किसी के लिए उपयोगी होगा कि वह अतिरिक्त गैर-अस्सी चरित्र पा सके:

grep --color='auto' -P -n "[^[:ascii:]]" myfile.txt

नोट: मेरे कंप्यूटर के grep (एक Mac) में -Pविकल्प नहीं था , इसलिए मैंने किया brew install grepऔर इसके ggrepबजाय ऊपर से कॉल शुरू किया grep


2
यह अब तक का सबसे अच्छा उत्तर है, क्योंकि यह मैक के साथ-साथ लिनक्स के लिए भी काम करता है।
tommy.carstensen

केवल वही जो मेरे लिए लिनक्स पर काम करता था।

9

निम्नलिखित कोड काम करता है:

find /tmp | perl -ne 'print if /[^[:ascii:]]/'

/tmpउस निर्देशिका के नाम से बदलें जिसे आप खोजना चाहते हैं।


2
एक मैक पर, यह काम करता है, जबकि अधिकांश grep- आधारित नहीं है।
मथायस फ्राइप

9

गैर-मुद्रण योग्य वर्णों की खोज करना। TLDR; कार्यकारी सारांश

  1. नियंत्रण वर्ण और विस्तारित यूनिकोड के लिए खोज
  2. लोकेल सेटिंग जैसे LC_ALL=Cgrep बनाने के लिए आवश्यक है कि आप विस्तारित यूनिकोड से क्या उम्मीद कर सकते हैं

एसओ पसंदीदा गैर-असीसी चार खोजक:

$ perl -ne 'print "$. $_" if m/[\x00-\x08\x0E-\x1F\x80-\xFF]/' notes_unicode_emoji_test

शीर्ष उत्तर के रूप में, उलटा grep:

$ grep --color='auto' -P -n "[^\x00-\x7F]" notes_unicode_emoji_test

शीर्ष उत्तर के रूप में लेकिन साथ LC_ALL=C:

$ LC_ALL=C grep --color='auto' -P -n "[\x80-\xFF]" notes_unicode_emoji_test

। । अधिक । । इस पर विस्तृत विवरण:। । ।

मैं टिप्पणियों में दफन ऊपर हार्वे के साथ सहमत हूं , गैर-मुद्रण योग्य पात्रों की खोज करने के लिए अक्सर अधिक उपयोगी होता है या गैर-एएससीआईआई को सोचना आसान होता है जब आपको वास्तव में गैर-मुद्रण योग्य सोचना चाहिए। हार्वे सुझाव देते हैं कि "इसका उपयोग करें:" [^\n -~]। डॉस पाठ फ़ाइलों के लिए \ r जोड़ें। यह " [^\x0A\x020-\x07E]" में अनुवाद करता है और सीआर के लिए \ x0D जोड़ता है।

इसके अलावा, grep में -c (पैटर्न की मिलान की हुई गिनती) तब गैर-प्रिंट करने योग्य वर्णों की खोज करते समय उपयोगी होता है क्योंकि मिलान किए गए तार टर्मिनल को गड़बड़ कर सकते हैं।

मैंने पाया कि रेंज 0-8 और 0x0e-0x1f (0x80-0xff रेंज में) एक उपयोगी पैटर्न है। यह TAB, CR और LF और एक या दो से अधिक असामान्य मुद्रण योग्य वर्णों को शामिल नहीं करता है। तो IMHO एक काफी उपयोगी (यद्यपि क्रूड) grep पैटर्न यह एक है:

grep -c -P -n "[\x00-\x08\x0E-\x1F\x80-\xFF]" *

वास्तव में, आमतौर पर आपको यह करने की आवश्यकता होगी:

LC_ALL=C grep -c -P -n "[\x00-\x08\x0E-\x1F\x80-\xFF]" *

टूट - फूट:

LC_ALL=C - set locale to C, otherwise many extended chars will not match (even though they look like they are encoded > 0x80)
\x00-\x08 - non-printable control chars 0 - 7 decimal
\x0E-\x1F - more non-printable control chars 14 - 31 decimal
\x80-1xFF - non-printable chars > 128 decimal
-c - print count of matching lines instead of lines
-P - perl style regexps

Instead of -c you may prefer to use -n (and optionally -b) or -l
-n, --line-number
-b, --byte-offset
-l, --files-with-matches

उदाहरण के लिए वर्तमान निर्देशिका के तहत सभी फ़ाइलों को संक्षिप्त करने के लिए उपयोग का व्यावहारिक उदाहरण:

LC_ALL=C find . -type f -exec grep -c -P -n "[\x00-\x08\x0E-\x1F\x80-\xFF]" {} + 

आप कई बार grep को समायोजित करना चाह सकते हैं। उदाहरण के लिए BS (0x08 - backspace) char का उपयोग कुछ प्रिंट करने योग्य फ़ाइलों में या VT (0x0B - ऊर्ध्वाधर टैब) को बाहर करने के लिए किया जाता है। बीईएल (0x07) और ईएससी (0x1B) चार्ट को भी कुछ मामलों में प्रिंट करने योग्य माना जा सकता है।

Non-Printable ASCII Chars
** marks PRINTABLE but CONTROL chars that is useful to exclude sometimes
Dec   Hex Ctrl Char description           Dec Hex Ctrl Char description
0     00  ^@  NULL                        16  10  ^P  DATA LINK ESCAPE (DLE)
1     01  ^A  START OF HEADING (SOH)      17  11  ^Q  DEVICE CONTROL 1 (DC1)
2     02  ^B  START OF TEXT (STX)         18  12  ^R  DEVICE CONTROL 2 (DC2)
3     03  ^C  END OF TEXT (ETX)           19  13  ^S  DEVICE CONTROL 3 (DC3)
4     04  ^D  END OF TRANSMISSION (EOT)   20  14  ^T  DEVICE CONTROL 4 (DC4)
5     05  ^E  END OF QUERY (ENQ)          21  15  ^U  NEGATIVE ACKNOWLEDGEMENT (NAK)
6     06  ^F  ACKNOWLEDGE (ACK)           22  16  ^V  SYNCHRONIZE (SYN)
7     07  ^G  BEEP (BEL)                  23  17  ^W  END OF TRANSMISSION BLOCK (ETB)
8     08  ^H  BACKSPACE (BS)**            24  18  ^X  CANCEL (CAN)
9     09  ^I  HORIZONTAL TAB (HT)**       25  19  ^Y  END OF MEDIUM (EM)
10    0A  ^J  LINE FEED (LF)**            26  1A  ^Z  SUBSTITUTE (SUB)
11    0B  ^K  VERTICAL TAB (VT)**         27  1B  ^[  ESCAPE (ESC)
12    0C  ^L  FF (FORM FEED)**            28  1C  ^\  FILE SEPARATOR (FS) RIGHT ARROW
13    0D  ^M  CR (CARRIAGE RETURN)**      29  1D  ^]  GROUP SEPARATOR (GS) LEFT ARROW
14    0E  ^N  SO (SHIFT OUT)              30  1E  ^^  RECORD SEPARATOR (RS) UP ARROW
15    0F  ^O  SI (SHIFT IN)               31  1F  ^_  UNIT SEPARATOR (US) DOWN ARROW

अद्यतन: मुझे हाल ही में इस पर फिर से विचार करना पड़ा। और, YYMV टर्मिनल सेटिंग्स / सौर मौसम पूर्वानुमान BUT पर निर्भर करता है। । मैंने देखा कि grep को कई यूनिकोड या विस्तारित वर्ण नहीं मिल रहे थे। भले ही सहज रूप से उन्हें 0x80 से 0xff तक की श्रेणी से मेल खाना चाहिए, 3 और 4 बाइट यूनिकोड वर्णों का मिलान नहीं किया गया। ??? क्या कोई इसे समझा सकता है? हाँ। @frabjous ने पूछा और @calandoa ने बताया कि LC_ALL=Cgrep मैच बनाने के लिए कमांड को लोकेल सेट करने के लिए इस्तेमाल किया जाना चाहिए।

जैसे मेरा लोकेल LC_ALL=खाली

$ locale
LANG=en_IE.UTF-8
LC_CTYPE="en_IE.UTF-8"
.
.
LC_ALL=

LC_ALL=खाली मैचों के साथ grep 2 बाइट एन्कोडेड वर्ण नहीं बल्कि 3 और 4 बाइट एन्कोडेड:

$ grep -P -n "[\x00-\x08\x0E-\x1F\x80-\xFF]" notes_unicode_emoji_test
5 copyright c2a9
7:call  underscore c2a0
9:CTRL
31:5 © copyright
32:7 call  underscore

grep LC_ALL=Cउन सभी विस्तारित वर्णों से मेल खाता है जो आप चाहते हैं:

$ LC_ALL=C grep --color='auto' -P -n "[\x80-\xFF]" notes_unicode_emoji_test  
1:���� unicode dashes e28090
3:��� Heart With Arrow Emoji - Emojipedia == UTF8? f09f9298
5:� copyright c2a9
7:call underscore c2a0
11:LIVE��E! ���������� ���� ���������� ���� �� �� ���� ����  YEOW, mix of japanese and chars from other e38182 e38184 . . e0a487
29:1 ���� unicode dashes
30:3 ��� Heart With Arrow Emoji - Emojipedia == UTF8 e28090
31:5  copyright
32:7 call underscore
33:11 LIVE��E! ���������� ���� ���������� ���� �� �� ���� ����  YEOW, mix of japanese and chars from other
34:52 LIVE��E! ���������� ���� ���������� ���� �� �� ���� ����  YEOW, mix of japanese and chars from other
81:LIVE��E! ���������� ���� ���������� ���� �� �� ���� ����  YEOW, mix of japanese and chars from other

यह पर्ल मैच (आंशिक रूप से स्टैकओवरफ्लो पर कहीं और पाया गया) या शीर्ष उत्तर पर उलटा grep लगता है कि सभी ~ अजीब ~ और ~ अद्भुत ~ "नॉन-अस्की" अक्षरों को लोकेल की स्थापना के बिना ढूंढते हैं:

$ grep --color='auto' -P -n "[^\x00-\x7F]" notes_unicode_emoji_test

$ perl -ne 'print "$. $_" if m/[\x00-\x08\x0E-\x1F\x80-\xFF]/' notes_unicode_emoji_test  

1 ‐‐ unicode dashes e28090
3 💘 Heart With Arrow Emoji - Emojipedia == UTF8? f09f9298
5 © copyright c2a9
7 call  underscore c2a0
9 CTRL-H CHARS URK URK URK 
11 LIVEE! あいうえお かが アイウエオ カガ   ซฌ आइ  YEOW, mix of japanese and chars from other e38182 e38184 . . e0a487
29 1 ‐‐ unicode dashes
30 3 💘 Heart With Arrow Emoji - Emojipedia == UTF8 e28090
31 5 © copyright
32 7 call  underscore
33 11 LIVEE! あいうえお かが アイウエオ カガ   ซฌ आइ  YEOW, mix of japanese and chars from other
34 52 LIVEE! あいうえお かが アイウエオ カガ   ซฌ आइ  YEOW, mix of japanese and chars from other
73 LIVEE! あいうえお かが アイウエオ カガ   ซฌ आइ  YEOW, mix of japanese and chars from other

एसओ पसंदीदा गैर-असीसी चार खोजक:

$ perl -ne 'print "$. $_" if m/[\x00-\x08\x0E-\x1F\x80-\xFF]/' notes_unicode_emoji_test

शीर्ष उत्तर के रूप में, उलटा grep:

$ grep --color='auto' -P -n "[^\x00-\x7F]" notes_unicode_emoji_test

शीर्ष उत्तर के रूप में लेकिन साथ LC_ALL=C:

$ LC_ALL=C grep --color='auto' -P -n "[\x80-\xFF]" notes_unicode_emoji_test

1
क्यों grep 2 से अधिक बाइट्स में एन्कोड किए गए वर्णों से मेल नहीं खाता है, जो @calandoa और frabjous के लिए धन्यवाद है। Grep कमांड से पहले LC_ALL = C का उपयोग करें।
गाएथे

1
800 अन्य upvotes के तहत दफन एक जवाब पोस्ट करने के लिए परेशान करने के लिए बहुत बहुत धन्यवाद! मेरी समस्या एक 0x02 चरित्र थी। आप शीर्ष के पास उस "उपयोग के व्यावहारिक उदाहरण" को डालना चाह सकते हैं, क्योंकि आपको वास्तव में पूरी पोस्ट पढ़ने की ज़रूरत नहीं है कि क्या यह समस्या है।
नौमेनन

1
मुझे पता है, वास्तव में पुराना जवाब है, और विस्तार से विस्तार है, लेकिन मेरे लिए उपयोगी है और दूसरों को भी मुझे आशा है। आपने सही कहा, मैंने TLDR जोड़ा; शिखर पर।
गौइथे सेप

1

अजीब बात है, मुझे आज यह करना पड़ा! मैंने पर्ल का उपयोग करना समाप्त कर दिया क्योंकि मुझे grep / egrep काम करने के लिए नहीं मिल सकता था (यहां तक ​​कि -P मोड में)। कुछ इस तरह:

cat blah | perl -en '/\xCA\xFE\xBA\xBE/ && print "found"'

यूनिकोड वर्णों के लिए ( \u2212उदाहरण के लिए नीचे) इसका उपयोग करें:

find . ... -exec perl -CA -e '$ARGV = @ARGV[0]; open IN, $ARGV; binmode(IN, ":utf8"); binmode(STDOUT, ":utf8"); while (<IN>) { next unless /\N{U+2212}/; print "$ARGV: $&: $_"; exit }' '{}' \;

1

यह जानना दिलचस्प हो सकता है कि एक यूनिकोड चरित्र की खोज कैसे की जाए। यह कमांड मदद कर सकता है। आपको केवल UTF8 में कोड जानना होगा

grep -v $'\u200d'

मैं वास्तव में एक विशेषज्ञ नहीं हूं, लेकिन मुझे यह जानने के लिए पर्याप्त है कि यह यूटीएफ 8 प्रतिनिधित्व नहीं है, यह यूटीएफ 16, या शायद यूटीएफ 32, या यूसीएस 16 है। 2-बाइट कोडपॉइंट के लिए वे तीनों समान हो सकते हैं।
बैक्सीसिमो

1

सभी गैर-एससीआई वर्णों को खोजने से यह धारणा मिलती है कि एक या तो यूनिकोड स्ट्रिंग्स की तलाश कर रहा है या व्यक्तिगत रूप से कहा गया वर्णों को अलग करना चाहता है।

पूर्व के लिए, इनमें से किसी एक को आज़माएं (परिवर्तन fileस्वचालन के लिए उपयोग किया जाता है):

 file=file.txt ; LC_ALL=C grep -Piao '[\x80-\xFF\x20]{7,}' $file | iconv -f $(uchardet $file) -t utf-8

 file=file.txt ; pcregrep -iao '[\x80-\xFF\x20]{7,}' $file | iconv -f $(uchardet $file) -t utf-8

 file=file.txt ; pcregrep -iao '[^\x00-\x19\x21-\x7F]{7,}' $file | iconv -f $(uchardet $file) -t utf-8

वेनिला ग्रीप LC_ALL = C के बिना सही ढंग से काम नहीं करता है जैसा कि पिछले उत्तरों में बताया गया है।

ASCII रेंज है x00-x7F, स्पेस है x20, क्योंकि स्ट्रिंग्स में नेगेटिव रेंज होने के कारण इसे छोड़ दिया जाता है।

नॉन-एएससीआईआई रेंज है x80-xFF, क्योंकि स्ट्रिंग्स में पॉजिटिव रेंज होती है।

स्ट्रिंग को सीमा के भीतर कम से कम 7 लगातार वर्ण माना जाता है। {7,}

शेल पठनीय आउटपुट के लिए, uchardet $fileफ़ाइल एन्कोडिंग का एक अनुमान देता है जो कि स्वचालित प्रक्षेप के लिए आइकॉन को दिया जाता है।


uchardetकमांड के उल्लेख के कारण यह बहुत उपयोगी है । उस सिर के लिए धन्यवाद!
बबलडलेव ०२५
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.