रंग कोड के साथ STDIN से STDOUT पास करने वाला प्रोग्राम छीन लिया गया?


64

मेरे पास एक कमांड है जो रंग में आउटपुट का उत्पादन करता है, और मैं इसे एक फ़ाइल में पाइप करना चाहता हूं जिसमें रंग कोड छीन लिए गए हैं। क्या कोई ऐसी कमांड है जो catरंग कोड को छोड़कर काम करती है ? मैं इस तरह से कुछ करने की योजना बना रहा हूं:

$ command-that-produces-colored-output | stripcolorcodes > outfile

4
यह एक बग हो सकता है कि एक प्रोग्राम रंगीन आउटपुट का उत्पादन करता है फिर भी यह आउटपुट एक फ़ाइल पर पुनर्निर्देशित होता है और इसे बंद करने का विकल्प प्रदान नहीं करता है। मुझे उम्मीद है कि ऐसा करने वाले किसी भी प्रोग्राम को isatty(stdin)ऐसा करने से पहले जाँच करने के लिए आउटपुट देना होगा। साझा करने का मन है कि कार्यक्रम क्या है?
एलेक्स

इसे पास करें cat- त्वरित परीक्षण जो मैंने चलाया grep --color=auto myusername /etc/passwdवह मुझे अपना उपयोगकर्ता नाम लाल पाठ एल्सेश्री के साथ देता है। grep --color=auto myusername /etc/passwd | catमुझे सादे सफेद पाठ देता है
ivanivan

1
वह कोई हल नहीं है। यह केवल इसलिए काम करता है क्योंकि grep --color=autoमानक आउटपुट टर्मिनल नहीं होने पर रंगीन आउटपुट का उत्पादन करने से बचता है। मैं एक कमांड के बारे में बात कर रहा हूं जो बिना रंग कोड के आउटपुट देता है। (जैसा कि ऊपर बताया गया है, इस तरह का व्यवहार यकीनन एक बग है, लेकिन कभी-कभी हमें अपूर्ण सॉफ़्टवेयर के साथ काम करने की आवश्यकता होती है जिसे हम आसानी से खुद को ठीक नहीं कर सकते हैं, और यही सवाल है।)
रयान थॉम्पसन

जवाबों:


59

आपको लगता है कि इसके लिए एक उपयोगिता होगी, लेकिन मैं इसे नहीं पा सका। हालांकि, इस पर्ल वन-लाइनर को चाल चलनी चाहिए:

perl -pe 's/\e\[?.*?[\@-~]//g'

उदाहरण:

$ command-that-produces-colored-output | perl -pe 's/\e\[?.*?[\@-~]//g' > outfile

या, यदि आप एक स्क्रिप्ट चाहते हैं तो आप इस प्रकार बचा सकते हैं stripcolorcodes:

#! /usr/bin/perl

use strict;
use warnings;

while (<>) {
  s/\e\[?.*?[\@-~]//g; # Strip ANSI escape codes
  print;
}

यदि आप केवल कलर कोड को स्ट्रिप करना चाहते हैं , और किसी अन्य एएनएसआई कोड (जैसे कर्सर की गति) को अकेले छोड़ दें, उपयोग करें

s/\e\[[\d;]*m//g;

प्रतिस्थापन के बजाय मैंने ऊपर उपयोग किया (जो सभी एएनएसआई एस्केप कोड हटाता है)।


9
जैसा कि एक अन्य उत्तर ( unix.stackexchange.com/questions/4527/… ) के लिए एक टिप्पणी में उल्लेख किया गया है , इस regex से खींच लिया गया था Term::ANSIColor। कृपया अपने स्रोतों को स्वीकार करें!
forivall

2
अपने स्रोतों को स्वीकार करें!
जुरगेन पॉल

29

GNU sed के साथ कलर कोड (विशेष वर्ण) निकालें

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

या

पायथन में एएनएसआई के भागने के क्रम को रोकें

Colorama अजगर पैकेज स्थापित करें ( pip install colorama)। में रखो stripcolorcodes:

#!/usr/bin/env python
import colorama, fileinput, sys;
colorama.init(strip=True);

for line in fileinput.input():
    sys.stdout.write(line)

भागो chmod +x stripcolorcodes


यह कमाल का है। वास्तव में मुझे क्या चाहिए!
adivis12

अजगर थोड़ा धीमा है लेकिन sedप्रभावशाली है :)

2
अजगर की कोशिश नहीं की, लेकिन sed संस्करण सभी रंगों को पट्टी नहीं करता है। (मैंने थकावट से परीक्षण नहीं किया, लेकिन इसने कुछ पृष्ठभूमि के रंगों को बरकरार रखा, इसलिए मैं तेज पर्ल विकल्प के साथ चला गया।)
rsaw

22

यदि आप शब्द :: ANSIColor मॉड्यूल स्थापित कर सकते हैं , तो यह पर्ल स्क्रिप्ट काम करता है:

#!/usr/bin/env perl
use Term::ANSIColor qw(colorstrip);
print colorstrip $_ while <>;

5
यह वास्तव में जहां मुझे वह रंग-कोड-केवल रेगेक्स मिला है। लेकिन सिर्फ एक रेगेक्स के लिए एक पूरे मॉड्यूल को स्थापित करना थोड़ा अधिक है।
cjm

4
मेह, यदि आप cpanm को सही तरीके से सेट करते हैं, तो यह मॉड्यूल को लगभग 5 सेकंड में स्थापित करता है।
रयान थॉम्पसन

फ़ाइल को स्क्रिप्ट लिखने की कोई आवश्यकता नहीं है। बस पाइप में:perl -mTerm::ANSIColor=colorstrip -n -e 'print colorstrip $_'
जेसी ग्लिक

10

आपके सिस्टम का एक्सेस है NodeJS आप निम्नलिखित नोड पैकेज स्थापित कर सकता है, strip-ansi-cli

$ npm install -g strip-ansi-cli

फिर आप अपनी कमांड को इस तरह चला सकते हैं:

$ command-that-produces-colored-output | strip-ansi > outfile

1
NodeJS एक बहुत बड़ी निर्भरता है, जब ऐसे समाधान होते हैं जो अधिकांश प्रणालियों में पहले से मौजूद भाषाओं और उपकरणों का उपयोग कर सकते हैं।
user137369

इसके अलावा, यह सूचीबद्ध सबसे धीमा समाधान है ( यहां देखें ) और आप शायद अंतर को देखेंगे।

3

इस सेड कमांड ने मेरे लिए यह किया:

sed -r "s/\\^\\[(\\[[^@-~]+[@-~]|[0-9@-_]|%@)//g"

उदाहरण:

$ command-that-produces-colored-output | sed -r "s/\\^\\[(\\[[^@-~]+[@-~]|[0-9@-_]|%@)//g" > outfile

यह नवीनतम संस्करण के साथ काम नहीं करता है sed

3

इसके लिए आप एसी का इस्तेमाल कर सकते हैं । यह ऊपर सूचीबद्ध कुछ भी की तुलना में तेजी से किया जाना चाहिए (हालांकि perlऔर sedसभ्य होना चाहिए)। यहाँ एक उदाहरण है:

curl -s wttr.in/LA | ac -s

एक अस्वीकरण के रूप में: रंग छानने की कार्यक्षमता मेरे द्वारा लिखी गई थी।


3
'एसी' वॉल्ड के लिए एक लिंक सहायक हो। ;)
विटाली कुशनर

acकार्यक्रम यहाँ हो रहा है: hub.darcs.net/vmchale/fastcat
माइकल बर

1
$ command-that-produces-colored-output | ansifilter

... और यदि आवश्यक हो, (dnf, ...) install ansifilter

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