如何在shell中为printf%s的输出着色?

时间:2015-02-12 21:59:00

标签: shell colors escaping printf echo

我在printf命令的多行上有一些ASCII艺术,例如:

printf %s '

\    /
 \  /
  \/
'

我希望每一行都有不同的颜色。我已经尝试了显而易见的\ e [31m但这不起作用,因为我需要printf命令打印为字符串(%s)并忽略反斜杠,因为我的ASCII艺术。 我也试过这个:

r="\e1;[31m"
e="\e[0m"

a='\    /'
b=' \  /'
c='  \/'

printf $r%s$e "$a"
没有运气。 这有可能吗? 谢谢。

3 个答案:

答案 0 :(得分:1)

您可以使用应用颜色的命令处理printf的输出。例如,

printf %s '
\    /
 \  /
  \/
 /  \
/    \
' | awk 'BEGIN{c=0} {printf "\033[3%dm%s\033[0m\n", 1 + c, $0; c = (c + 1) % 6;}'

给出

^[[31m^[[0m
^[[32m^[[0m
^[[33m\    /^[[0m
^[[34m \  /^[[0m
^[[35m  \/^[[0m
^[[36m /  \^[[0m
^[[31m/    \^[[0m

分步骤:

  • printf命令通过管道(" |")将其输出发送到单引号中给出的awk脚本。
  • 在该脚本中,我使用大括号中的第一个块,在特殊关键字" BEGIN"之后初始化了一个计数器' c' (执行一次)。
  • 为awk读取的每一行执行大括号中的第二个块。
  • awk使用自己的printf打印转义序列设置颜色,打印文本并重置颜色。
  • " $ 0"符号包含整行(没有换行符)。
  • 我使用了一个表达式来更新' c'在每一行之后("%"是模数 操作员,制作' c'范围从0到5)。

答案 1 :(得分:1)

这将有效:

r='\033[31m'
e='\033[0m'

a='\    /'
b=' \  /'
c='  \/'

printf "$r%s$e\n" "$a" "$b" "$c"

答案 2 :(得分:0)

您可以先将颜色存储在变量中,然后使用它们来格式化字符串,如下所示:

#!/bin/bash

RED="\e[0;31m"
GREEN="\e[0;32m"
RESET="\e[0m"

printf "%s $RED%s $GREEN%s $RESET%s\n" BLACK RED GREEN BLACK