2009-01-02 6 views
11

autodetects मैं ऐसा करना चाहते हैं:findstr या ग्रेप कि chararacter एन्कोडिंग (UTF-16)

findstr /s /c:some-symbol * 

या ग्रेप बराबर

grep -R some-symbol * 

लेकिन मैं उपयोगिता की जरूरत UTF में encoded फ़ाइलें स्वतः खोजें करने के लिए -16 (और दोस्तों) और उन्हें उचित रूप से खोजें। मेरी फाइलों में बाइट ऑर्डरिंग मार्क एफएफईई भी है, इसलिए मैं वीर ऑटोडेटेक्शन की भी तलाश नहीं कर रहा हूं।

कोई सुझाव?


मैं विंडोज विस्टा और एक्सपी का जिक्र कर रहा हूं।

+0

आपकी फ़ाइलों के कुछ UTF-16 में कर रहे हैं और ASCII, या क्या में कुछ? – Artelius

+0

हाँ, कुछ ASCII, कुछ यूटीएफ -16। –

उत्तर

0

इस blog article के अनुसार डेमन कॉर्टेसी grep द्वारा यूटीएफ -16 फाइलों के साथ काम नहीं करता है, जैसा कि आपने पाया था। हालांकि, यह प्रस्तुत करता है इस काम के आसपास:

for f in `find . -type f | xargs -I {} file {} | grep UTF-16 | cut -f1 -d\:` 
     do iconv -f UTF-16 -t UTF-8 $f | grep -iH --label=$f ${GREP_FOR} 
done 

यह यूनिक्स के लिए स्पष्ट रूप से है, यकीन नहीं क्या विंडोज पर बराबर होगा। उस आलेख के लेखक उपरोक्त करने के लिए एक शेल-स्क्रिप्ट भी प्रदान करते हैं जो आप github here पर पा सकते हैं।

यह केवल यूटीएफ -16 फाइलों को पकड़ता है। आप अपनी ASCII फ़ाइलों को सामान्य तरीके से भी grep करेंगे।

0

आपने यह नहीं कहा कि आप किस प्लेटफ़ॉर्म पर ऐसा करना चाहते हैं।

विंडोज पर, आप PowerGREP का उपयोग कर सकते हैं, जो स्वचालित रूप से यूनिकोड फ़ाइलों का पता लगाता है जो बाइट ऑर्डर चिह्न से शुरू होते हैं। (बीओएम के बिना फ़ाइलों को स्वतः पहचानने का एक विकल्प भी है। ऑटो-डिटेक्शन यूटीएफ -8 के लिए बहुत विश्वसनीय है, लेकिन यूटीएफ -16 के लिए सीमित है।)

4

सुझावों के लिए धन्यवाद। मैं विंडोज विस्टा और एक्सपी का जिक्र कर रहा था।

मैं भी इस समाधान की खोज की, मुक्त Sysinternals strings.exe का उपयोग कर:

C:\> strings -s -b dir_tree_to_search | grep regexp 

Strings.exe अर्क तार यह पाता है के सभी (बाइनरी से है, लेकिन ठीक काम करता है पाठ भी फाइलों के साथ) और एक फ़ाइल नाम और पेट के साथ प्रत्येक परिणाम पहले जोड़ता , इसलिए इसे regexp में ध्यान में रखें (या पाइपलाइन में कट या किसी अन्य चरण का उपयोग करें)। -s इसे एक रिकर्सिव निष्कर्षण बनाता है और -b बस बैनर संदेश को दबाता है।

आखिरकार मैं आश्चर्यचकित हूं कि प्रमुख खोज उपयोगिताएं जीएनयू grep और findstr यूनिकोड चरित्र एन्कोडिंग को मूल रूप से संभाल नहीं करती हैं।

+0

उनके घर यूनिक्स वातावरण पर, यूटीएफ -16 बहुत कम आम है, और फाइलें आम तौर पर यूटीएफ -8 में होती हैं, जिन्हें वे ठीक से संभालते हैं। – bdonlan

+0

शायद पूरी लाइन निकालने के लिए इतना अच्छा नहीं है, लेकिन स्ट्रिंग वाली सभी फ़ाइलों को खोजने का प्रयास करने के लिए बिल्कुल सही है (जिसे मैं करने की कोशिश कर रहा हूं)। धन्यवाद। –

3

विंडोज़ पर, आप find.exe का भी उपयोग कर सकते हैं।

find /i /n "YourSearchString" *.* 

एकमात्र समस्या इस प्रिंट के नामों के बाद मैचों के नाम है। आप findstr को

find /i /n "YourSearchString" *.* | findstr /i "YourSearchString" 
+0

दुर्भाग्यवश पाते हैं कि कमांड मिलान पैटर्न (वाइल्डकार्ड/नियमित अभिव्यक्ति) जैसे मिलान पैटर्न का समर्थन नहीं करता है। –

1

का संभावित हल अपने UTF-16 ASCII कन्वर्ट करने के लिए है या एएनएसआई

TYPE UTF-16.txt > ASCII.txt 

तो फिर तुम findstr उपयोग कर सकते हैं पाइपिंग द्वारा उन्हें फ़िल्टर कर सकते हैं।

FINDSTR object ASCII.txt 
+0

... क्षमा, क्या? – Mehrdad

2
findstr /s /c:some-symbol * 

निम्नलिखित चरित्र के बारे में पता आदेश एन्कोडिंग के साथ बदला जा सकता है:

for /r %f in (*) do @find /i /n "some-symbol" "%f" 
+0

यदि वेंकटेश्वर का उत्तर नीचे दिया गया है, तो आप प्राप्त करें: /r% f (*) में @ find/i/n "कुछ-प्रतीक" "% f" | findstr/i "कुछ-प्रतीक" जो फ़ाइल नामों को फ़िल्टर करेगा। "विफल" की तलाश में फ़ाइलों के एक सेट को खोजते समय मुझे यह उपयोगी लगता है। मुझे परवाह नहीं था कि यह किस फाइल में दिखाई दिया था, मैं बस देखना चाहता था कि इसमें कोई फ़ाइल "विफल" है या नहीं। – Eli

1

विंडोज के उच्च संस्करणों में, UTF-16 समर्थित है बाहर के बॉक्स। यदि नहीं, तो chcp कमांड द्वारा सक्रिय कोड पृष्ठ को बदलने का प्रयास करें।

मेरे मामले में अकेले findstr का उपयोग करते समय UTF-16 फ़ाइलों के लिए असफल रहा था, लेकिन यह type के साथ काम किया:

type *.* | findstr /s /c:some-symbol