通过滤色器管道命令


13

Unix中是否存在类似的东西?

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

在这里,我并不是说要显示原汁原味的颜色代码文本(例如,粘贴到文件中)。我只是想让文本实际显示为该颜色。这可能吗?

Answers:


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取决于您的设置。如果您具有支持RGB的终端,则甚至可以使用rgb001rgb123等功能。有关更多详细信息,请参见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)页中找到所有详细信息。


6

zsh

autoload colors; colors
for color (${(k)fg})
  eval "$color() {print -n \$fg[$color]; cat; print -n \$reset_color}"

接着:

$ echo "while" | blue
while

1

(如评论中所述,如果有,请改用tput

使用bourne shell和echo(内置)命令了解ANSI转义,\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

或者,更通用的shell脚本(例如/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

1
当然可以。它旨在用于嵌入式系统或busybox之类的应急环境。我之所以决定写这个答案,是因为我认为这些代码段在某些情况下很有用-至少对于busybox用户和我来说,他们今天只能在嵌入式环境中使用shell的内置命令来输出颜色。
wataash

忘了说普通的busybox没有tput。
wataash
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.