सोलारिस पर एक कमांड से आउटपुट को कलर करने के लिए sed का उपयोग करना


29

मेरे पास एक ksh स्क्रिप्ट है जो linux और solaris दोनों पर काम करना चाहिए। मैं विशिष्ट कमांड के आउटपुट को रंगने की कोशिश कर रहा हूं। यह linux (विशेष रूप से RHEL6) पर काम करता है, लेकिन सोलारिस (SunOS 5.10) पर नहीं।

लिनक्स पर कमांड (आउटपुट "परीक्षण" सही ढंग से लाल रंग का है):

[amartin@linuxbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,'
test

सोलारिस पर कमांड (आउटपुट "परीक्षण" रंगीन नहीं है):

[amartin@sunbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,'
x1B[31mtestx1B[0m

क्या इस कमांड को तैयार करने का एक तरीका है कि आउटपुट लाल है, आउटपुट में कच्चे कोड के बिना? मैं 'इको' कमांड को नहीं बदल सकता, क्योंकि मैं वास्तव में जो कमांड चला रहा हूं, उसके लिए एक भरण है।

जवाबों:


35

\xNN GNU सेड में एक एस्केप सीक्वेंस है, लेकिन यह मानक नहीं है, और विशेष रूप से यह सोलारिस पर उपलब्ध नहीं है।

आप अपनी स्क्रिप्ट में एक शाब्दिक बच चरित्र शामिल कर सकते हैं, लेकिन यह पढ़ने और संपादित करने के लिए कठिन बना देगा।

आप printfएक भागने चरित्र उत्पन्न करने के लिए उपयोग कर सकते हैं । यह अष्टकोणीय पलायन को समझता है, हेक्साडेसिमल को नहीं।

esc=$(printf '\033')
echo "test" | sed "s,.*,${esc}[31m&${esc}[0m,"

आप कॉल tputमें रिप्लेसमेंट टेक्स्ट जेनरेट करने के लिए कॉल कर सकते हैं । यह कमांड टर्मोफ डेटाबेस में एस्केप सीक्वेंस को देखता है। सिद्धांत रूप में, का उपयोग करना tputआपकी स्क्रिप्ट को अधिक पोर्टेबल बनाता है, लेकिन व्यवहार में आप एएनएसआई से बचने वाले कोड का उपयोग नहीं करने वाले टर्मिनल का सामना करने की संभावना नहीं रखते हैं ।

echo "test" | sed "s,.*,$(tput setaf 1)&$(tput sgr0),"

यह cat |sedभी एक thx पर colorize करने के लिए महान काम करता है !
कुंभ राशि

8

इसे इस्तेमाल करना आसान होगा tput

tput setaf 1; somecommand; tput sgr0

या

tput setaf 1
somecommand
tput sgr0

यह अग्रभूमि को लाल रंग में सेट करता है, somecommandजो तब लाल रंग में आउटपुट प्रदर्शित करता है और फिर रंग क्रम को साफ करता है। यह कम से कम के साथ काम करता है bash, zshऔर ksh

देखें tmux(1)और terminfo(5)अधिक जानकारी के लिए कि आप क्या कर सकते हैं tput


जवाब के लिए धन्यवाद। जैसा कि मैंने पहले कहा था, मैं इको कमांड नहीं बदल सकता। a इको ’उस प्रक्रिया के लिए सिर्फ एक स्टैंड-इन है जिसे मैं बुला रहा हूं, जिसे मैं बदल नहीं सकता। क्या किसी भी तरह से tput के साथ sed का उपयोग करना संभव है? इसके अलावा, जब मैं उस कमांड को सनोस 5.10 पर चलाता हूं तो मुझे कोई रंग नहीं दिखता है।
ACM

मैंने इसे अलग-अलग कमांड में अलग करने के लिए इसे अपडेट किया।
बहमट

यह मेरे वर्तमान कार्यान्वयन से बेहतर है कि यह सोलारिस पर कच्चे एससीआई कोड को प्रिंट नहीं करता है। हालाँकि (जो भी कारण हो), यह सोलारिस पर 'सोमेकोमैंड' के उत्पादन को रंग नहीं देता है। यह linux पर करता है। मैंने @Gilles उत्तर स्वीकार कर लिया है, जो दोनों करता है। धन्यवाद।
ACM

0

कुछ टर्मिनल (जैसे मेरे लिए इटर्म में बश) आपको "ctrl + [" के बाद "ctrl-v" कुंजी को हिट करने की अनुमति देते हैं और यह शाब्दिक एस्केप चरित्र को इनपुट स्ट्रिंग में डाल देगा। यदि यह काम करता है, तो आप संभवतः स्क्रीन पर "^ [" मुद्रित वर्ण देखेंगे, लेकिन यदि आप अपने कर्सर को इसके चारों ओर ले जाते हैं, तो यह इसे एक चरित्र के रूप में मानेगा क्योंकि यह वास्तव में पर्दे के पीछे है।

यह समझने के लिए कि क्या हो रहा है (और यदि यह संभव है तो परीक्षण करना), तो आप ctrl + v और उसके बाद ctrl + i टाइप कर सकते हैं। आपको यह देखना चाहिए कि टैब कैरेक्टर आपके प्रॉम्प्ट स्ट्रिंग में डाला गया था। ऐसा क्यों है, इसके लिए सीएस इतिहास है: लेकिन यह पता चलता है कि वास्तव में पुराने कीबोर्ड में ctrl + था, मैंने टैब वर्ण भेजने के लिए हार्ड वायर्ड किया था; और टैब कुंजी उसी विद्युत संकेत को भी भेजती है।

उस विरासत कारण के लिए, कई टर्मिनलों के लिए बैश अभी भी उन्हीं पात्रों को मैप करने के लिए कुछ ctrl कोड की व्याख्या करता है।

Ctrl + I टैब कैरेक्टर पर मैप करता है, और ctrl + [एससीआई एस्केप कैरेक्टर से मेल खाता है।

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