स्क्रीन पर अजीब प्रतीकों grep का उपयोग करते समय?


12

./trans ... एस्केप कोड दिखाते हुए कमांड आउटपुट

कोई जानकारी है कि इसका कारण क्या हो सकता है? Grep का उपयोग किए बिना, केवल सामान का प्रदर्शन आईएसओ कोड और खाली स्थान हैं।

सॉफ्टवेयर का इस्तेमाल किया

कमान: ./trans --id --input /path/to/txt | grep ISO | grep [a-z]

root@box /test # alias grep
alias grep='grep --color=auto'
root@box /test # type grep
grep is aliased to `grep --color=auto'

सामान्य उत्पादन:

पठनीय पाठ और URL के साथ ट्रांस कमांड आउटपुट


कृपया एक छवि संलग्न करने के बजाय आउटपुट पेस्ट करें। ताकि अन्य अपने सिस्टम पर समान पुन: पेश करने के लिए चिपकाई गई कमांड का पुन: उपयोग कर सकें।
तृप्ति

9
@ थुशी इस मामले में एक स्क्रीनशॉट उपयुक्त है, क्योंकि वे लापता ग्लिफ़ प्रतीकों को यहां पेस्ट करने में सक्षम नहीं होंगे।
स्पार्कहॉक

क्या आप अनुगामी s, और के परिणाम के बिना चलाए गए कमांड के स्क्रीनशॉट में संपादित कर सकते हैं और ? grepalias greptype grep
माइकल होमर

जवाबों:


28

स्क्रीनशॉट मैंगल्ड ANSI रंग कोड दिखाता है , जो टेक्स्ट रेंडरिंग को नियंत्रित करता है। बोल्ड / उज्ज्वल टेक्स्ट को अनुक्रम के साथ निर्मित किया जाता है ␛[1m, जिसे आमतौर पर आपके टर्मिनल द्वारा व्याख्या किया जाता है और सीधे स्क्रीन पर प्रदर्शित नहीं किया जाता है: यह सिर्फ पाठ के अगले बिट को उज्ज्वल बनाता है। अन grepपैड आउटपुट का स्क्रीनशॉट दिखाता है कि प्रत्येक लाइन पर लेबल और मानों के बीच का रंग अंतर है, इसलिए मूल आउटपुट उनका उपयोग कर रहा है।

ऐसा प्रतीत होता है कि यह क्रम आपके फाइनल से टूट गया है grep, जो कोड में "एम" से मेल खाता है (क्योंकि यह एक पत्र है [a-z]) और इसे लाल रंग में ही उजागर करने का प्रयास किया गया है। इसने एक आंशिक भागने का क्रम पीछे छोड़ दिया, जिसे आपका टर्मिनल संसाधित नहीं कर सकता था।

भागने का चरित्र U + 001B है, जो हेक्साडेसिमल संख्या है जो अज्ञात-चरित्र बक्से में प्रदान की जाती है। जो प्रदर्शित होता है वह है पलायन (बॉक्स), ए [, एक 1लाल, mजिसके बाद अपेक्षित मिलान पाठ "एनजी", और "22" ("सामान्य रंग और तीव्रता के लिए संख्यात्मक कोड") के साथ अंत में वही हो रहा है।


टूटी हुई आउटपुट वास्तव में है:

␛ [1 ␛ [31 एम मेंग ␛ [22M ␛ [22 ␛ [31 एम एम ␛ [22M 

जहां ␛[31mपाठ लाल बनाता है और ␛[22mइसे वापस सफेद में बदल देता है, दोनों को मूल पाठ में वर्णों के grepआसपास डाला जाता है m। मूल बस था:

 Eng [1m eng eng [22m 

जो अभी उज्ज्वल है " eng" और फिर सामान्य पाठ पर वापस आ जाता है।

आप अपने फ़ाइनल grepको बदलकर grep --color=alwaysऔर इसमें पाइपिंग करके इसकी जाँच कर सकते हैं hexdump, जो आपके टर्मिनल द्वारा व्याख्या किए गए सभी अचूक पात्रों और लोगों को दिखाएगा।


आप इससे कुछ तरीकों से निपट सकते हैं। एक grepपल के लिए अपने उपनाम के बिना उपयोग करने के लिए है:

./trans --id --input /path/to/txt | grep ISO | \grep [a-z]

बैकस्लैश अस्थायी रूप से उर्फ ​​को छोड़ देता है और grepसीधे चलता है।

मूल कमांड से एएनएसआई कोड को अलग करना है, जिसके लिए इस प्रश्न में कुछ सुझाव हैं :

./trans --id --input /path/to/txt | perl -pe 's/\e\[[\d;]*m//g' | grep ISO | grep [a-z]

फिर भी एक अन्य विकल्प अंत में एक बाहरी पाइप जोड़ना है:

./trans --id --input /path/to/txt | grep ISO | grep [a-z] | cat

क्योंकि अंतिम grepउत्पादन सीधे TTY के लिए नहीं है, लेकिन catएक पाइप के माध्यम से, यह रंगीन हाइलाइटिंग सम्मिलित नहीं करेगा।

शायद सबसे अच्छा विकल्प पहली बार में टर्मिनल नियंत्रण अनुक्रमों का उपयोग करने से रोकने के लिए अनुवाद शेल प्राप्त करना है, जब यह टर्मिनल के लिए नहीं है। यह आपके लेखक (ओं) को एक बग रिपोर्ट को ठीक से शामिल करेगा और अनुवाद शेल के ansi()फ़ंक्शन के लिए एक कोड फिक्स करेगा , लेकिन कोई भी इसे डाउनलोड कर सकता है:

TERM=dumb ./trans --id --input /path/to/txt | grep ISO | grep [a-z]

यह dumbअनुवाद शैल के वातावरण में टर्मिनल प्रकार से गुजरता है, जिसे कम से कम ईसीएमए -48 रंग समर्थन नहीं होने के रूप में मान्यता देता है। (अफसोस की बात है कि ट्रांसलेशन शेल टर्मोफाइ का उपयोग नहीं करता है, और केवल अपने ही कोड के हार्डवेयर्स में टर्मिनल प्रकार जो इसे समझता है और नियंत्रण अनुक्रमों का उपयोग करता है।)


वाह, मैं कभी भी अपने आप से और इस तरह की जगह के बिना डिबग नहीं कर पाऊंगा, इसलिए धन्यवाद!
फ्रीडो

IMO अपराधी आसानी से टूटा हुआ GREP_COLORया GREP_COLORSपर्यावरण चर हो सकता है जिसमें पूर्ण संख्याओं के बजाय पूर्ण SGR एस्केप अनुक्रम शामिल हैं।
उदाहरण

वाह, इतने सारे समाधान। आप --color=noअंतिम grep में भी जोड़ सकते हैं (या TERM=dumbइसे लागू कर सकते हैं )
addngel
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.