वर्कफ़्लो (फ़ाइल) से सभी गैर-एससीआई अक्षर हटाना


13

मैं एक फ़ाइल से सभी गैर-असि अक्षर कैसे निकालूंगा? क्या इसे करने के लिए कोई विशिष्ट आदेश होगा?

grep --colour='auto' -P -n'[^\x00-\x7]' /usr/local/...

मेरा मानना ​​है कि यह वर्कफ़्लो के भीतर वर्णों को ढूंढता है, लेकिन मैं प्रश्न में वर्णों के सभी उदाहरणों को कैसे निकालूंगा?



3
संबंधित: यदि आप नियंत्रण चार्ट के साथ समस्याओं से बचना चाहते हैं (चुपचाप से छुटकारा पाने के बजाय), तो आप बस cat -vउनके लिए एएससीआईआई प्रत्यावर्तन में दिखाने के लिए उपयोग कर सकते हैं। (उदाहरण के ^Gलिए \007)
मतिजा नालिस

1
जब आप कहते हैं "गैर-अस्सी के पात्र" क्या आप भी उच्चारण पात्रों को शामिल करते हैं?
कप्तान मैन

1
@MatijaNalis प्रतिनिधित्व के बारे में अधिक जानकारी: en.wikipedia.org/wiki/Caret_notation
wjandrea

1
उपयोग मामला क्या है? बहुत बार विशिष्ट उपकरण या अलग-अलग दृष्टिकोण होते हैं जो विशेष पात्रों के एक गुच्छा को हटाने की तुलना में बहुत बेहतर काम करते हैं। कृपया ध्यान दें कि ASCII में ऊर्ध्वाधर टैब, घंटी, और NUL जैसे कई "विशेष" वर्ण शामिल हैं - क्या आप वाकई प्रिंट करने योग्य वर्णों का मतलब नहीं हैं ?
l0b0

जवाबों:


26

ASCII वर्ण 0 से 177 (अष्ट) तक की सीमा के वर्ण हैं ।

किसी फ़ाइल में इस श्रेणी के बाहर के वर्णों को हटाने के लिए, उपयोग करें

LC_ALL=C tr -dc '\0-\177' <file >newfile

trआदेश एक उपयोगिता है कि एकल पात्रों पर काम करता है , या तो, अन्य एकल वर्ण (लिप्यंतरण) के साथ उन्हें प्रतिस्थापन उन्हें हटाने, या एक ही चरित्र में एक ही चरित्र का रन संपीड़ित।

ऊपर दिए गए कमांड से fileसंशोधित सामग्री को पढ़ा और लिखा जाएगा newfile। यूटिलिटी डिलीट करेक्टर (उन्हें ट्रांसफर करने के बजाए) -dकरने का विकल्प दिया गया trहै, और -cयह दिए गए अंतराल (अंदर के बजाय) के बाहर के कैरेक्टर पर विचार करता है।

LC_ALL=Cयह सुनिश्चित करता है कि प्रत्येक बाइट मान एक मान्य वर्ण बनाता है। इसके बिना, कुछ trकार्यान्वयन निरस्त हो जाएंगे यदि उन्हें बाइट्स के अनुक्रम मिले जो कि लोकेल के चरित्र एन्कोडिंग में मान्य वर्ण नहीं बनाते हैं।


संशोधित फ़ाइल के साथ मूल फ़ाइल को बदलने के लिए, उपयोग करें

LC_ALL=C tr -dc '\0-\177' <file >newfile &&
mv newfile file

यह trसफलतापूर्वक पूरी हो जाने के बाद पुरानी फ़ाइल के नाम पर नई फ़ाइल का नाम बदल देता है । यदि trसफलतापूर्वक पूरा नहीं होता है, तो या तो यह मूल फ़ाइल को नहीं पढ़ सकता है या नई फ़ाइल को नहीं लिख सकता है, मूल फ़ाइल को अपरिवर्तित छोड़ दिया जाएगा।

वैकल्पिक रूप से, मूल फ़ाइल के मेटा डेटा (अनुमतियाँ आदि) का अधिक से अधिक संरक्षण करना, उपयोग करना

cp file tmpfile &&
LC_ALL=C tr -dc '\0-\177' <tmpfile >file &&
rm tmpfile


9

यदि आप सभी की जरूरत है एक regex है: [\x00-\x7F]कि आप कई उपयोगिताओं के लिए आवेदन कर सकते हैं:

<file LC_ALL=C   sed   's/[^\o0-\o177]//g'      # GNU sed without POSIXLY_CORRECT
<file LC_ALL=C   awk   '{gsub(/[^\0-\177]/,"");print}'
<file            perl  -pe 's/[^[:ascii:]]//g;'
<file LC_ALL=C   tr    -dc '\0-\177'

यूनिक्स में परिभाषित है कि sed, awk और perl "पाठ फ़ाइलों" की अपेक्षा करें। इस मामले में सभी अच्छी तरह से काम करते हैं। लेकिन विशेष रूप से, awk एक अनुगामी नई लाइन (चाहे वह स्रोत फ़ाइल में मौजूद हो या नहीं) को जोड़ता है (प्रिंटफ़ का उपयोग करके इनपुट पर सभी नईलाइन्स निकालता है)। Tr किसी भी फ़ाइल प्रकार के साथ काम करने के लिए डिज़ाइन किया गया है। हालाँकि NUL ( \0) POSIX पाठ फ़ाइल में एक मान्य वर्ण नहीं है और इसे टाला जाना चाहिए:

लाइनों में NUL वर्ण नहीं हैं ...

वास्तव में, कई नियंत्रण वर्ण कुछ विशिष्ट परिस्थितियों में अन्य समस्याएं उत्पन्न करेंगे।
तो, शायद आप की जरूरत है[\x07-\x0d\x20-\x7e]

<file LC_ALL=C   sed   's/[^\o007-\o015\o040-\o176]//g'            # GNU sed without POSIXLY_CORRECT
<file LC_ALL=C   awk   '{gsub(/[^\0-\15\40-\176]/,"");print}'
<file            perl  -pe 's/[^\x{7}-\x{d}\x{20}-\x{7e}]//g;'
<file LC_ALL=C   tr    -dc '\7-\15\40-\176'

रेंज 7-13 (दशमलव में) \a\b\t\n\v\f\r(क्रम में) है।
एक समान (संभवत: अधिक पोर्टेबल) श्रेणी को [^[:space:][:print:]] (similar because it doesn't include\ _ a \ b`bell और backspace-- के रूप में लिखा जा सकता है ।

<file LC_ALL=C   sed   's/[^[:space:][:print:]]//g'  # GNU sed without POSIXLY_CORRECT
<file LC_ALL=C   awk   '{gsub(/[^[:space:][:print:]]/,"");print}'
<file            perl   -pe 's/[^[:space:][:print:]]//g;'
<file LC_ALL=C   tr     -dc '[:space:][:print:]'

संबंधित:
किसी भी ASCII चरित्र
पर्ल समाधान
Posix पाठ फ़ाइल Rexx


ध्यान दें कि इनपुट trकिसी भी प्रकार की फाइल हो सकती है, न कि केवल टेक्स्ट फाइलें। awkदूसरी ओर, एक पाठ फ़ाइल लेता है।
Kusalananda

मेरे लिए "केवल अस्सी वर्ण" वाली फ़ाइल को कॉल करने के लिए "टेक्स्ट फ़ाइल" (हां, हां: आम आदमी के शब्दों में) को कॉल करना कुछ भी मुश्किल है। @ कुसलानंद (वैसे भी जोड़ा गया जाग के बारे में नोट)।
आइजैक

ध्यान दें कि gensub()एक gawk एक्सटेंशन है। आप चाहते हैं gsub(...); print, और (अधिक) पोर्टेबल होने के लिए हेक्स दृश्यों (और LC_ALL = C) के बजाय ऑक्टल का उपयोग करेंगे।
स्टीफन चेजेलस

@ StéphaneChazelas GNU sed की सीमा क्या है जो वाक्यविन्यास GNU को विशिष्ट बनाती है (मुझे POSIXLY_CORRECT समस्या समझ में आती है)।
आइजैक

[^\o0]POSIX में बैकस्लैश, ओ और 0 के अलावा sed(सभी कार्यान्वयन में लेकिन GNU sed) वर्णों पर मेल करना है । यह GNU की सीमा नहीं है sedबल्कि एक गैर-अनुपालन विस्तार है, यही वजह है कि जब POSIXLY_CORRECT पर्यावरण में है तो यह अक्षम है)।
स्टीफन चेजलस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.