【问题标题】:How can I colour the output of printf %s in shell?如何在 shell 中为 printf %s 的输出着色?
【发布时间】:2024-01-06 22:12:01
【问题描述】:

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

printf %s '

\    /
 \  /
  \/
'

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

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

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

printf $r%s$e "$a"

没有运气。 这有可能吗? 谢谢。

【问题讨论】:

    标签: shell colors escaping printf echo


    【解决方案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)。

    【讨论】:

    • 谢谢,这很好用。您介意向我解释一下 awk 命令的每个部分的作用吗?我对这一切都很陌生,谢谢。
    【解决方案2】:

    这将起作用:

    r='\033[31m'
    e='\033[0m'
    
    a='\    /'
    b=' \  /'
    c='  \/'
    
    printf "$r%s$e\n" "$a" "$b" "$c"
    

    【讨论】:

      【解决方案3】:

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

      #!/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
      

      【讨论】:

        最近更新 更多