पाठ स्ट्रीम से ANSI रंग कोड हटा रहा है


73

से आउटपुट की जांच कर रहा है

perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";'

एक पाठ संपादक में (उदाहरण के लिए, vi) निम्नलिखित दिखाता है:

^[[37mABC
^[[0m

कोई आउटपुट फ़ाइल से ANSI रंग कोड कैसे निकालेगा? मुझे लगता है कि सबसे अच्छा तरीका होगा एक तरह के धारा संपादक के माध्यम से उत्पादन को पाइप करना।

निम्नलिखित काम नहीं करता है

perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' | perl -pe 's/\^\[\[37m//g' | perl -pe 's/\^\[\[0m//g'

प्रश्न का उत्तर नहीं है, लेकिन आप आउटपुट को पाइप भी कर सकते हैं moreया less -Rजो टेक्स्ट एडिटर के बजाय एस्केप कोड को रंग के रूप में व्याख्या कर सकते हैं।
टेराडॉन

जवाबों:


98

वर्ण ^[[37mऔर ^[[0mका हिस्सा हैं एएनएसआई भागने दृश्यों (सीएसआई कोड)इन विनिर्देशों को भी देखें ।

GNU का उपयोग करना sed

sed 's/\x1b\[[0-9;]*m//g'
  • \x1b(या \x1B) पलायन विशेष चरित्र है
    ( sedविकल्प का समर्थन नहीं करता है ) \eऔर\033
  • \[ पलायन क्रम का दूसरा पात्र है
  • [0-9;]* रंग मूल्य है
  • m एस्केप सीक्वेंस का अंतिम पात्र है

⚠ MacOS पर, डिफ़ॉल्ट sedआदेश जैसे विशेष वर्ण का समर्थन नहीं करता \eके रूप में द्वारा बताया SLM और steamer25 टिप्पणी में। इसके बजाय उपयोग करें gsedकि आप का उपयोग कर स्थापित कर सकते हैं brew install gnu-sed

ओपी की कमांड लाइन के साथ उदाहरण:   (ओपी का अर्थ है मूल पोस्टर)

perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' | 
      sed 's/\x1b\[[0-9;]*m//g'

टॉम हेल ग्राफिक्स मोड (रंग) से बचने के क्रम के लिए [a-zA-Z]केवल पत्र के बजाय अन्य सभी एस्केप अनुक्रमों को हटाने का सुझाव देता है m। लेकिन [a-zA-Z]बहुत चौड़ा हो सकता है और बहुत अधिक निकाल सकता है। मिचेल फेल्स्की और मिगुएल मोटा ने क्रमशः [mGKH]और केवल कुछ भागने के दृश्यों को हटाने का प्रस्ताव दिया [mGKF]ब्रिटन केरीन इंगित करता है कि त्रुटि / चेतावनी से रंगों को हटाने के Kअलावा भी उपयोग किया जाना चाहिए (रीडायरेक्ट करना न भूलें )।mgccgcc 2>&1 | sed...

sed 's/\x1b\[[0-9;]*m//g'           # Remove color sequences only
sed 's/\x1b\[[0-9;]*[a-zA-Z]//g'    # Remove all escape sequences
sed 's/\x1b\[[0-9;]*[mGKH]//g'      # Remove color and move sequences
sed 's/\x1b\[[0-9;]*[mGKF]//g'      # Remove color and move sequences
Last escape
sequence
character   Purpose
---------   -------------------------------
m           Graphics Rendition Mode (including Color)
G           Horizontal cursor move
K           Horizontal deletion
H           New cursor position
F           Move cursor to previous n lines

का उपयोग करते हुए perl

sedकुछ ऑपरेटिंग सिस्टम पर स्थापित संस्करण सीमित हो सकता है (जैसे macOS)। आदेश perlमें अधिक ऑपरेटिंग सिस्टम पर आम तौर पर स्थापित / अपडेट करने में आसान होने का लाभ है। एडम काट्ज पीसीआरई में \e(उसी के रूप में \x1b) उपयोग करने का सुझाव देते हैं ।

फ़िल्टर करने के लिए आप कितनी आज्ञाओं के आधार पर अपना regex चुनें:

perl -pe 's/\e\[[0-9;]*m//g'          # Remove colors only
perl -pe 's/\e\[[0-9;]*[mG]//g'
perl -pe 's/\e\[[0-9;]*[mGKH]//g'
perl -pe 's/\e\[[0-9;]*[a-zA-Z]//g'
perl -pe 's/\e\[[0-9;]*m(?:\e\[K)?//g' # Adam Katz's trick

ओपी की कमांड लाइन के साथ उदाहरण:

perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' \
      | perl -pe 's/\e\[[0-9;]*m//g'

प्रयोग

जैसा कि स्टुअर्ट कार्डल की टिप्पणी से पता चलता है , इस sedकमांड लाइन का उपयोग प्रोजेक्ट एनगिनेक्स बैड बॉट (1000 स्टार) द्वारा ईमेल रिपोर्ट को साफ करने के लिए किया जाता है ;;


2
sedकमांड और स्पष्टीकरण के लिए धन्यवाद । :)
Redsandro

2
कुछ रंग कोड (जैसे लिनक्स टर्मिनल) में एक उपसर्ग होता है, उदाहरण के लिए अपने regex में 1;31mबेहतर जोड़ें ;: cat colored.log | sed -r 's/\x1b\[[0-9;]*m//g'या उन्हें छीन नहीं लिया जाएगा।
लालसांद्रो

1
ईमेल रिपोर्ट को साफ करने के लिए इसे github.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker/blob/… में उपयोग किया जाता है ।
स्टुअर्ट कार्डॉल

2
ध्यान रखें कि OSX संस्करण sedw / काम नहीं किया गया उदाहरण दिखाया गया है, gsedफिर भी संस्करण है।
SLM

2
OSX sed के बारे में स्लम की टिप्पणी के लिए अधिक संदर्भ: यह \ X1b जैसे नियंत्रण वर्णों का समर्थन नहीं करता है। जैसे, stackoverflow.com/a/14881851/93345 । आप के माध्यम से प्राप्त कमांड प्राप्त कर सकते हैं brew install gnu-sed
स्टीमर 25

21

मैं एक बेहतर भागने अनुक्रम पदच्युत पता चला है। इसे देखो:

perl -pe 's/\x1b\[[0-9;]*[mG]//g'


2
स्वीकृत उत्तर ( superuser.com/a/380778/46794 ) से क्या सुधार हुआ है ?
ब्लेज़ोरब्लेड

4
@ ब्लेज़रब्लड यह ओएस एक्स पर काम करता है, जबकि sed -rऐसा नहीं है।
बीवेरेंगो

10

के रूप में प्रदर्शित किया जाता है क्या ^[है नहीं ^ और [; यह ASCII ESCवर्ण है, जो ( Escया संकेतन का अर्थ Ctrl कुंजी) द्वारा निर्मित है ।Ctrl[^

ESC0x1B हेक्साडेसिमल या 033 ऑक्टल है, इसलिए आपको इसका उपयोग \x1Bया \033अपने रेगीक्स में करना होगा:

perl -pe 's/\033\[37m//g; s/\033[0m//g'

perl -pe 's/\033\[\d*(;\d*)*m//g'

6

यदि आप कुछ सरल पसंद करते हैं तो आप स्ट्रिप-एनी मॉड्यूल ( Node.js आवश्यक) का उपयोग कर सकते हैं :

$ npm install --global strip-ansi-cli

फिर इसे इस तरह उपयोग करें:

$ strip-ansi < colors.o

या बस एक स्ट्रिंग में पास करें:

$ strip-ansi '^[[37mABC^[[0m'

यह cat( यूयूओसी ) का एक बेकार उपयोग है - इसे strip-ansi colors.oकम से कम करना या करना संभव है strip-ansi < colors.o
स्कॉट

1
@ सस्कॉट श्योर, आप भी कर सकते हैं strip-ansi < colors.o, लेकिन अनुभव से लोग पाइपिंग से अधिक परिचित हैं। मैंने जवाब अपडेट कर दिया है।
सिंद्रे सोरहस

अच्छा सरल समाधान
पेंग गेंग


2

"उत्तर दिया गया" प्रश्न मेरे लिए काम नहीं करता था, इसलिए मैंने perl टर्म :: ANSIColor मॉड्यूल द्वारा निर्मित एस्केप दृश्यों को हटाने के बजाय इस regex को बनाया।

cat colors.o | perl -pe 's/\x1b\[[^m]+m//g;

ग्रैविटी की रेग्क्स को ठीक काम करना चाहिए, लेकिन + का उपयोग करना ठीक काम करता है।


4
(१) आपका क्या मतलब है The "answered" question? क्या आपका मतलब है स्वीकृत उत्तर? (2) यह कमांड काम नहीं करता है - यह निष्पादित भी नहीं करता है - क्योंकि इसमें एक बेजोड़ (असंतुलित) उद्धरण है। (3) यह cat( यूयूओसी ) का एक बेकार उपयोग है - ऐसा करना संभव होना चाहिए । (४) किसी फाइल में कोड होने के बारे में कभी किसी ने क्या कहा ? perl -pe command colors.o.o
स्कॉट

2

मेरा मानना ​​है कि यह सभी ANSI एस्केप अनुक्रमों का एक आधिकारिक निष्कासन है :

perl -pe '
  s/\e\[[\x30-\x3f]*[\x20-\x2f]*[\x40-\x7e]//g;
  s/\e[PX^_].*?\e\\//g;
  s/\e\][^\a]*(?:\a|\e\\)//g;
  s/\e[\[\]A-Z\\^_@]//g;'

(कृपया ध्यान दें कि पर्ल, कई अन्य भाषाओं की तरह (लेकिन sed नहीं), \eबच चरित्र के रूप में स्वीकार करता है Esc, \x1bया \033कोड द्वारा, टर्मिनलों में दिखाया गया है ^[। मैं इसका उपयोग यहां कर रहा हूं क्योंकि यह अधिक सहज लगता है।)

यह पर्ल कमांड, जिसे आप चाहें तो सभी एक लाइन पर चला सकते हैं, इसमें चार प्रतिस्थापन हैं:

पहला CSI सीक्वेंस (एस्केप कोड सीक्वेंस जो कि "कंट्रोल सीक्वेंस इंट्रोड्यूसर" के साथ शुरू होता है, के बाद चला जाता है Esc[, जो कि सिलेक्ट ग्राफिक रेंडिशन सिक्वेंस की तुलना में बहुत अधिक होता है जो कलर कोड और अन्य टेक्स्ट डेकोरेशन बनाते हैं)।

दूसरा प्रतिस्थापन शेष दृश्यों को हटा देता है जिसमें अनुगामी वर्ण शामिल होते हैं और ST (स्ट्रिंग टर्मिनेटर Esc\) के साथ समाप्त हो जाते हैं । तीसरे प्रतिस्थापन एक ही बात है, लेकिन यह भी अनुमति देता है ऑपरेटिंग सिस्टम कमान दृश्यों एक साथ समाप्त करने के लिए BEL ( \x07, \007, अक्सर \a)।

चौथा प्रतिस्थापन शेष बचता है।

अन्य शून्य-चौड़ाई वाले ASCII वर्णों जैसे कि BEL और अन्य अस्पष्ट C0 और C1 नियंत्रण वर्णों को हटाने पर विचार करें । मैं उपयोग कर रहा हूं s/[\x00-\x1f\x7f-\x9f\xad]+//g, जिसमें डिलीट और सॉफ्ट हाइफन भी शामिल है । यह यूनिकोड के उच्च कोडित शून्य-चौड़ाई वाले पात्रों को बाहर करता है, लेकिन मेरा मानना ​​है कि यह ASCII (यूनिकोड \x00- \xff) के लिए संपूर्ण है । यदि आप ऐसा करते हैं, तो इन अंतिम को हटा दें क्योंकि वे लंबे दृश्यों में शामिल हो सकते हैं।


1

"tput sgr0" ने इस नियंत्रण वर्ण को छोड़ दिया ^ (B ^ [
यहाँ पर ध्यान रखने के लिए एक संशोधित संस्करण है।

perl -pe 's/\e[\[\(][0-9;]*[mGKFB]//g' logfile.log

इसके लिए धन्यवाद ... इससे मुझे छुटकारा पाने के लिए काम किया गया tput sgr0कि अन्य समाधान कभी भी छुटकारा पाने में सक्षम नहीं लगते हैं।
TxAG98

0

मुझे पोटीन के माध्यम से इंटरएक्टिव टॉप आउटपुट इकट्ठा करने से जोड़े गए पात्रों को हटाने में इसी तरह की समस्या थी और इससे मदद मिली:

cat putty1.log | perl -pe 's/\x1b.*?[mGKH]//g'

3
यह cat( यूयूओसी ) का एक बेकार उपयोग है - ऐसा करना संभव होना चाहिए । perl -pe command putty1.log
स्कॉट

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.