通过颜色过滤器传送命令

通过颜色过滤器传送命令

Unix 中存在这样的东西吗?

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

在这里,我并不是指出现文字颜色代码文本(例如,粘贴到文件中)。我的意思只是让文本实际以该颜色显示在终端中。这可能吗?

答案1

你会用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)联机帮助页

答案2

这是一个小脚本,可以做到这一点。将其保存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

答案3

zsh

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

进而:

$ echo "while" | blue
while

答案4

(正如评论中所讨论的,使用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 的工作原理

相关内容