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

如何在shell中为printf%s的输出着色?,shell,colors,escaping,printf,echo,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" 没有运气。 这可能吗? 谢谢。您可以使用应用颜

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

printf %s '

\    /
 \  /
  \/
'
我想让每一行都有不同的颜色。我已经尝试过明显的\e[31m,但这不起作用,因为我需要printf命令以字符串(%s)的形式打印并忽略反斜杠,因为我的ASCII艺术。 我也试过:

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

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

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

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

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

分步骤:

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

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

#!/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
这将有助于:

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

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

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

谢谢,这很好用。你能给我解释一下awk命令的每一部分都是做什么的吗?我对这一切都很陌生,谢谢。
r='\033[31m'
e='\033[0m'

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

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