2013-08-01 16 views
53

से रंगों को हटा रहा है मेरे पास कुछ स्क्रिप्ट है जो रंग उत्पन्न करती है और मुझे इससे छुटकारा पाने की आवश्यकता है।आउटपुट

#!/bin/bash 

exec > >(tee log) # redirect the output to a file but keep it on stdout 
exec 2>&1 

./somescript 

निर्गम (लॉग फ़ाइल में) है:

java (pid 12321) is [email protected][60G[@[0;32m OK @[0;39m] 

मैं कैसे ESC चरित्र यहाँ डाल करने के लिए पता नहीं था, इसलिए मैं उसके स्थान पर @ डाल दिया।

मैं में स्क्रिप्ट बदल दिया है:

#!/bin/bash 

exec > >(tee log) # redirect the output to a file but keep it on stdout 
exec 2>&1 

./somescript | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" 

लेकिन अब यह मुझे (लॉग फ़ाइल में) देता है:

java (pid 12321) is [email protected][60G[ OK ] 

मैं भी कैसे हटा सकते हैं इस '@[60G?

शायद पूरी लिपि के लिए पूरी तरह से रंग को अक्षम करने का कोई तरीका है?

उत्तर

76

According to Wikipedia है, जो सब बातों को जानता है, sed आदेश आप उपयोग कर रहे विशेष रूप से m (रंग आदेश) और K (कमांड "लाइन के हिस्से को मिटा") को संभालने के लिए डिज़ाइन किया गया है में [m|K]। आपकी स्क्रिप्ट एक पंक्ति में सभी OKs प्राप्त करने के लिए पूर्ण कर्सर स्थिति को 60 (^[[60G) पर सेट करने का प्रयास कर रही है, जो आपकी sed लाइन कवर नहीं करती है।

(ठीक, [m|K] शायद (m|K) या [mK], होना चाहिए क्योंकि आप एक पाइप चरित्र से मेल की कोशिश नहीं कर रहे हैं। लेकिन यह अभी महत्वपूर्ण नहीं है।)

आप [mGK] को अपने आदेश में है कि फाइनल मैच स्विच करते हैं या (m|G|K), आप उस अतिरिक्त नियंत्रण अनुक्रम को पकड़ने में सक्षम होना चाहिए।

./somescript | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" 
+12

बीएसडी/ओएसएक्स उपयोगकर्ता: हमारे पास आमतौर पर -r विकल्प नहीं है। 'ब्रू इंस्टॉल करें gnu-sed' एक सक्षम संस्करण स्थापित करेगा। 'Gsed' के साथ चलाएं। –

+0

यदि मैं 'echo "$ (tput setaf 1) foo $ (tput sgr0) बार करता हूं" | sed -r "s/\ x1B \ [([0-9] {1,2} (; [0-9] {1,2})?)? [mGK] // g" | बिल्ली-ए', मुझे मिलता है: 'foo^ओ बार $' तो मुझे लगता है कि कुछ पात्र सही ढंग से हटाए नहीं गए हैं, है ना? क्या आप जानते हैं कि कैसे सही करें? – edi9999

+1

@ edi9999 जहां तक ​​मैं कह सकता हूं, अंतर यह है कि 16 रंगों से परे रंग सेटिंग्स ('सेटफ' समर्थन के रूप में) केवल दो की तुलना में अधिक पैरामीटर की आवश्यकता होती है; मेरा regex दो का समर्थन करता है। '*' के लिए पहले '?' आउट को बदलना चाहिए। 'Sgr0' को संभालना संभव है लेकिन एक खोज के आधार पर यह संभवतः इस हैकी रेगेक्स-आधारित उत्तर के दायरे से बाहर बढ़ता है। –

10

हम्म, यकीन है कि अगर यह आपके लिए 'tr' 'पट्टी' (हटाना) होगा काम करेंगे, लेकिन नियंत्रण कोड नहीं - कोशिश:

./somescript | tr -d '[:cntrl:]' 
+10

काम करता है अचानक यह नई लाइनों को भी हटा देता है – ruX

+0

हां, एलएफ और सीआर (कोड) नियंत्रण कोड हैं; यदि आप एक से अधिक पंक्तियों में रुचि रखते हैं तो यह समाधान नहीं हो सकता है। चूंकि ऐसा प्रतीत होता है कि आप जावा प्रोग्राम चला रहे हैं, मुझे लगता है कि रंग वहां से प्रबंधित किए जाते हैं; अन्यथा आपको अपने कंसोल सेटअप (यानी टर्मिनल सेटिंग्स/रंग योजना) और/या 'रंग' का समर्थन करने वाले प्रत्येक कमांड के विकल्पों पर देखने की आवश्यकता होगी, यानी ls --color = कभी –

+0

मुझे यह उत्तर इसके लालित्य के लिए पसंद है, यहां तक ​​कि अगर यह सिर्फ रंगों को हटाने से ज्यादा करता है। धन्यवाद! –

5

मैं भी है कि कभी कभी समस्या थी , एसआई चरित्र दिखाई दिया।

यह इस इनपुट के साथ उदाहरण के लिए हुआ: echo "$(tput setaf 1)foo$(tput sgr0) bar"

यहाँ एक तरह से

./somescript | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" | sed "s/\x0f//g" 
+0

सुनिश्चित नहीं है कि इस उत्तर को इतना कम क्रेडिट क्यों प्राप्त होता है। यह केवल मेरे लिए काम कर रहा है ... – m8mble

3

@ जेफ-निशानेबाज़ के समाधान में मदद की मुझे से छुटकारा भी एसआई चरित्र (में बदलाव) (0x0f) पट्टी है रंग कोड में से कुछ। मैं हटाने के लिए regex के लिए एक और छोटा सा हिस्सा जोड़ा कुछ और:

sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" # Original. Removed Red ([31;40m[1m[error][0m) 
sed -r "s/\x1B\[([0-9];)?([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" # With an addition, removed yellow and green ([1;33;40m[1m[warning][0m and [1;32;40m[1m[ok][0m) 
       ^^^^^^^^^ 
       remove Yellow and Green (and maybe more colors) 
-5

यह मेरे लिए काम करता है:

./somescript | cat 
+1

यह इस बात पर निर्भर करता है कि कैसे 'somescript' लागू किया गया है। यह पहचान सकता है या नहीं भी हो सकता है कि इसका मानक आउटपुट एक छोटा सा है। (शब्दों में अपराधियों को वास्तव में प्रोग्राम में हार्ड-कोड टर्मिनल-विशिष्ट एस्केप कोड, और अन्य टर्मिनलों या स्क्रिप्ट में उपयोग किए जाने पर बहुत ही ब्रेक लगाना)। –

+0

धन्यवाद टोबी। मैंने परीक्षण करने के लिए django के manage.py का उपयोग किया, लेकिन आपने जो कहा वह समझ में आता है। – spiderlama

5

मैं अन्य उत्तर में से किसी से सभ्य परिणाम नहीं मिल सकता है, लेकिन मेरे लिए काम किया है:

somescript | sed -r "s/[[:cntrl:]]\[[0-9]{1,3}m//g" 

यदि मैं केवल नियंत्रण चार "^ [", यह रंग डेटा के बाकी, छोड़ दिया जैसे, "33m" हटा दिया। रंग कोड और "एम" सहित चाल ने किया था। मैं s/\ x1B // g के साथ परेशान हूं काम नहीं करता क्योंकि \ x1B [31m निश्चित रूप से गूंज के साथ काम करता है।

+1

ओएसएक्स (बीएसडी sed) पर, विस्तारित regex के लिए '-r' के बजाय' -E' का उपयोग करें। अधिक पाया जा सकता है [यहां] (https://unix.stackexchange.com/a/131940) – Assambar