एक रंग फिल्टर के माध्यम से एक कमांड पाइपिंग


13

क्या यूनिक्स में ऐसा कुछ मौजूद है?

$ echo "this should show in red" | red
$ echo "this should show in green" | green
$ echo "this should show in blue" | blue

यहाँ मेरा शाब्दिक रंग कोड पाठ के आने का मतलब नहीं है (उदाहरण के लिए फ़ाइल में चिपकाया जाना)। मैं सिर्फ उस रंग के रूप में टर्मिनल में वास्तव में दिखाने के लिए पाठ के लिए मतलब है। क्या यह संभव है?

जवाबों:


14

यहाँ एक छोटी सी स्क्रिप्ट है जो बस यही करती है। इसे colorअपने में एक निर्देशिका के रूप में सहेजें $PATH(उदाहरण के लिए, ~/binयदि यह आपके में है $PATH):

#!/usr/bin/env perl

use strict;
use warnings;
use Term::ANSIColor; 

my $color=shift;
while (<>) {
    print color("$color").$_.color("reset");
} 

फिर, स्क्रिप्ट के माध्यम से अपने पाठ को पास करें, .एक रंग को मैच और निर्दिष्ट करने के लिए पैटर्न के रूप में:

स्क्रिप्ट चलाने वाले टर्मिनल का स्क्रीनशॉट

समर्थित रंग आपके टर्मिनल की क्षमताओं पर निर्भर करते हैं। अधिक जानकारी के लिए, पैकेज का दस्तावेज़ीकरण देखें Term::ANSIColor


क्या रंगों की एक सूची है जो कहीं से गुजरने के लिए वैध है?
जॉर्ज

@George जो आपके सेटअप पर निर्भर करता है। यदि आपके पास आरजीबी-सक्षम टर्मिनल है, तो आप चीजों का उपयोग भी कर सकते हैं rgb001, rgb123आदि । अधिक जानकारी के लिए perldoc.perl.org/Term/ANSIColor.html#Supported-Colors देखें।
terdon

23

आप इसके लिए उपयोग tputकरेंगे:

tput setaf 1
echo This is red
tput sgr0
echo This is back to normal

यह एक पाइप बनाने के लिए इस्तेमाल किया जा सकता है:

red() { tput setaf 1; cat; tput sgr0; }
echo This is red | red

मूल रंग क्रमशः काले (0), लाल (1), हरे, पीले, नीले, मैजेंटा, सियान और सफेद (7) हैं। आपको terminfo(5)मैनपेज में सभी विवरण मिलेंगे ।



1

(जैसा कि टिप्पणियों में चर्चा की गई है, यदि आपके पास है तो इसका उपयोग करेंtput )

बोर्न शेल और echo(बिल्ट-इन) कमांड का उपयोग करना जो विकल्प के \eसाथ एएनएसआई से बचना समझता है -e:

black()  { IFS= ; while read -r line; do echo -e '\e[30m'$line'\e[0m'; done; }
red()    { IFS= ; while read -r line; do echo -e '\e[31m'$line'\e[0m'; done; }
green()  { IFS= ; while read -r line; do echo -e '\e[32m'$line'\e[0m'; done; }
yellow() { IFS= ; while read -r line; do echo -e '\e[33m'$line'\e[0m'; done; }
blue()   { IFS= ; while read -r line; do echo -e '\e[34m'$line'\e[0m'; done; }
purple() { IFS= ; while read -r line; do echo -e '\e[35m'$line'\e[0m'; done; }
cyan()   { IFS= ; while read -r line; do echo -e '\e[36m'$line'\e[0m'; done; }
white()  { IFS= ; while read -r line; do echo -e '\e[37m'$line'\e[0m'; done; }

echo '    foo\n    bar' | red

या, अधिक सामान्य शेल स्क्रिप्ट (कहते हैं /usr/local/bin/colorize):

#!/bin/sh

usage() {
    echo 'usage:' >&2
    echo '  some-command | colorize {black, red, green, yellow, blue, purple, cyan, white}' >&2
    exit 1
}

[ -z "$1" ] && usage

case $1 in
    black)  color='\e[30m' ;;
    red)    color='\e[31m' ;;
    green)  color='\e[32m' ;;
    yellow) color='\e[33m' ;;
    blue)   color='\e[34m' ;;
    purple) color='\e[35m' ;;
    cyan)   color='\e[36m' ;;
    white)  color='\e[36m' ;;
    *) usage ;;
esac

IFS=
while read -r line; do
    echo -e $color$line'\e[0m'
done

IFS=व्हॉट्सएप ट्रिमिंग को रोकने के लिए आवश्यक है ( विवरण के लिए POSIX देखें)।

IFS कैसे काम करता है


मैं उपयोग करने के लिए पसंद करने की सलाह देता हूं tput
LinuxSecurityFreak

यह पूरी तरह से गैर-पोर्टेबल समाधान है। मेरा मतलब है कि आपको POSIX का पालन करना चाहिए।
LinuxSecurityFreak 11

1
ज़रूर, अगर हम कर सके। यह एम्बेडेड बॉक्स की तरह एम्बेडेड सिस्टम या बचाव वातावरण पर उपयोग करने का इरादा है। मैंने इस उत्तर को लिखने का फैसला किया क्योंकि मेरा मानना ​​है कि ये कोड स्निपेट कुछ स्थितियों में उपयोगी हैं - कम से कम व्यस्त बॉक्स उपयोगकर्ताओं के लिए और मेरे लिए, जिन्हें आज एक एम्बेडेड वातावरण पर शेल के अंतर्निहित कमांड के साथ ही रंगों का उत्पादन करना था।
वातश

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