grepएक टेक्स्ट प्रोसेसिंग टूल है। यह उनके इनपुट को टेक्स्ट फाइल होने की उम्मीद करता है । ऐसा लगता है कि वही trmacOS पर जाता है (भले ही trबाइनरी फ़ाइलों का समर्थन करने वाला हो)।
कंप्यूटर डेटा को बाइट्स के अनुक्रम के रूप में संग्रहीत करते हैं । एक पाठ वर्णों का एक क्रम है। वर्णों को बाइट्स के रूप में एन्कोड करने के कई तरीके हैं, जिन्हें वर्ण एन्कोडिंग कहा जाता है । दुनिया के अधिकांश हिस्सों में, विशेष रूप से OSX पर डी वास्तविक मानक वर्ण एन्कोडिंग, यूटीएफ -8 है , जो यूनिकोड वर्ण सेट के लिए एन्कोडिंग है । केवल 256 संभव बाइट्स हैं, लेकिन एक लाख से अधिक संभव यूनिकोड वर्ण हैं, इसलिए अधिकांश वर्ण एकाधिक बाइट्स के रूप में एन्कोड किए गए हैं। UTF-8 एक चर-लंबाई एन्कोडिंग है: चरित्र के आधार पर, एक वर्ण को एन्कोड करने में एक से चार बाइट्स लग सकते हैं। बाइट्स के कुछ क्रम UTF-8 में किसी भी वर्ण का प्रतिनिधित्व नहीं करते हैं। इसलिए, बाइट्स के क्रम हैं जो मान्य UTF-8 पाठ फ़ाइलें नहीं हैं।
trशिकायत कर रहा है क्योंकि यह इस तरह के एक बाइट अनुक्रम का सामना करना पड़ा। यह एक टेक्स्ट फ़ाइल को UTF-8 में एन्कोडेड देखने की उम्मीद करता है, लेकिन यह बाइनरी डेटा देखता है जो मान्य UTF-8 नहीं है।
Microsoft Word दस्तावेज़ एक पाठ फ़ाइल नहीं है: यह एक शब्द संसाधन दस्तावेज़ है। वर्ड प्रोसेसिंग डॉक्यूमेंट फॉर्मेट न केवल टेक्स्ट, बल्कि फॉर्मेटिंग, एंबेडेड इमेज आदि को भी एनकोड करते हैं। वर्ड फॉर्मेट, ज्यादातर वर्ड प्रोसेसिंग फॉर्मेट की तरह, टेक्स्ट फाइल नहीं है।
आप स्थानीय को बदलकर बाइट्स पर काम करने के लिए टेक्स्ट प्रोसेसिंग टूल को निर्देश दे सकते हैं । विशेष रूप से, "C" लोकेल का चयन करें, जिसका मूल अर्थ है "कुछ भी नहीं फैंसी"। कमांड लाइन पर, आप पर्यावरण चर के साथ स्थानीय सेटिंग्स चुन सकते हैं ।
export LC_CTYPE=C
tr '\r' '\n' < target-file | grep search-string
यह किसी भी त्रुटि का उत्सर्जन नहीं करेगा, लेकिन यह कुछ भी उपयोगी नहीं होगा क्योंकि target-fileअभी भी एक बाइनरी फ़ाइल है जिसमें आपके द्वारा निर्दिष्ट अधिकांश खोज स्ट्रिंग शामिल होने की संभावना नहीं है।
संयोग से, tr '\r' '\n'एक बहुत ही उपयोगी कमांड नहीं है जब तक कि आपके पास मैक ओएस 9 या पुराने से पाठ की फाइलें नहीं बची हैं। \r(कैरिज रिटर्न) मैक ओएस एक्स से पहले मैक ओएस में न्यूलाइन सेपरेटर था। ओएसएक्स के बाद से, न्यूलाइन सेपरेटर \n(लाइन फीड, यूनिक्स मानक) है और टेक्स्ट फाइलों में कैरिज रिटर्न नहीं होता है। Windows दो-वर्ण अनुक्रम CR-LF का उपयोग करता है लाइन ब्रेक का प्रतिनिधित्व करने के लिए; tr -d '\r'एक Windows पाठ फ़ाइल को एक यूनिक्स / लिनक्स / OSX पाठ फ़ाइल में बदल देगा।
तो आप कमांड लाइन से वर्ड डॉक्यूमेंट में कैसे सर्च कर सकते हैं? एक .docxवर्ड डॉक्यूमेंट वास्तव में एक ज़िप आर्काइव है जिसमें कई फाइलें होती हैं, जिनमें से एक एक्सएमएल में होती है ।
unzip -l Position-Paper-Final-Version.docx
Mac OS X में ज़िप फ़ाइलों के अंदर खोजने के लिए zipgrep उपयोगिता शामिल है ।
zipgrep DeCSS Position-Paper-Final-Version.docx
परिणाम बहुत पठनीय नहीं होने वाला है क्योंकि docx प्रारूप में XML फाइलें ज्यादातर एक बड़ी लाइन से मिलकर बनी होती हैं। यदि आप दस्तावेज़ के मुख्य बॉडी टेक्स्ट के अंदर खोजना चाहते हैं, word/document.xmlतो आर्काइव से फ़ाइल निकालें । ध्यान दें कि दस्तावेज़ पाठ के अलावा, इस फ़ाइल में XML मार्कअप है जो दस्तावेज़ की संरचना का प्रतिनिधित्व करता है। एक्सएमएल मार्कअप की मालिश sedकरने योग्य लाइनों में विभाजित करने के लिए आप थोड़ा सा मालिश कर सकते हैं।
unzip -p Position-Paper-Final-Version.docx word/document.xml |
sed -e 's/></>\n</g' |
grep DeCSS