首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我想连接两个小雕像输出(不同的颜色)。

我想连接两个小雕像输出(不同的颜色)。
EN

Stack Overflow用户
提问于 2021-12-21 16:37:15
回答 5查看 478关注 0票数 2

目前,我有这样的输出格式:

代码语言:javascript
复制
{ echo "$(figlet buddhi)"; echo "$(figlet lw)"; }
代码语言:javascript
复制
 _               _     _ _     _
| |__  _   _  __| | __| | |__ (_)
| '_ \| | | |/ _` |/ _` | '_ \| |
| |_) | |_| | (_| | (_| | | | | |
|_.__/ \__,_|\__,_|\__,_|_| |_|_|

 _
| |_      __
| \ \ /\ / /
| |\ V  V /
|_| \_/\_/

我想要这个输出格式:

代码语言:javascript
复制
figlet buddhi lw
 _               _     _ _     _   _
| |__  _   _  __| | __| | |__ (_) | |_      __
| '_ \| | | |/ _` |/ _` | '_ \| | | \ \ /\ / /
| |_) | |_| | (_| | (_| | | | | | | |\ V  V /
|_.__/ \__,_|\__,_|\__,_|_| |_|_| |_| \_/\_/

原因是:我想用不同的颜色涂上每一个名字(布吉,lw)。但是,保留连续字符串的格式,或以最大空格分隔,如上面所示。

示例:

代码语言:javascript
复制
 #COMMANDS CREATED INSIDE /ETC/BASH.BASHRC FILE
 # USING ANSI COLORS
 RED="\e[31m"
 ORANGE="\e[33m"
 BLUE="\e[94m"
 GREEN="\e[92m"
 STOP="\e[0m"


 printf "${GREEN}"
 printf "=================================\n"
 printf "${ORANGE}"
 figlet -f standard "Buddhi"
 printf "${BLUE}"
 figlet -f  small "LW"
 printf "${GREEN}"
 printf "=================================\n"
 printf "${STOP}"
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2021-12-21 16:59:22

将每个单词的行存储在数组中,逐行输出两个数组。由于“佛”的第一行似乎短了一个字符,所以我将第一个单词的最长行长存储在一个变量中,并使用%-s格式来填充每一行。

代码语言:javascript
复制
#! /bin/bash
RED="\e[31m"
ORANGE="\e[33m"
BLUE="\e[94m"
GREEN="\e[92m"
STOP="\e[0m"

mapfile -t left  < <(figlet -f standard "Buddhi")
mapfile -t right < <(figlet -f small    "LW")

maxlength=0
for line in "${left[@]}" ; do
    if (( ${#line} > maxlength )) ; then
        maxlength=${#line}
    fi
done

printf "${GREEN}"
printf "=================================\n"

for ((i=0; i<=${#left[@]}; ++i)) ; do
    printf "${ORANGE}%-${maxlength}s ${GREEN}%s\n" "${left[i]}" "${right[i]}"
done

printf "${GREEN}"
printf "=================================\n"
printf "${STOP}"
票数 5
EN

Stack Overflow用户

发布于 2021-12-21 17:14:54

为了代替figlet,我将使用以下输入:

代码语言:javascript
复制
$ cat buddhi
 _               _     _ _     _
| |__  _   _  __| | __| | |__ (_)
| '_ \| | | |/ _` |/ _` | '_ \| |
| |_) | |_| | (_| | (_| | | | | |
|_.__/ \__,_|\__,_|\__,_|_| |_|_|

$ cat lw
 _
| |_      __
| \ \ /\ / /
| |\ V  V /
|_| \_/\_/

假设figlet为每个输入字符串生成相同数量的输出行,我们可以使用paste (@作为分隔符)和一个while/read循环来生成所需的输出:

代码语言:javascript
复制
printf "${GREEN}"
printf "============================\n"

maxwidth=$(awk '{max=length($0) > max ? length($0) : max}END{print max}' buddhi)

while IFS='@' read -r col1 col2
do
    printf "${ORANGE}%-*s ${BLUE}%s\n" "${maxwidth}" "${col1}" "${col2}"
done < <(paste -d"@" buddhi lw)

printf "${GREEN}"
printf "============================\n"

这就产生了:

扩展到3个输入流:

代码语言:javascript
复制
printf "${GREEN}"
printf "============================\n"

max1=$(awk '{max=length($0) > max ? length($0) : max}END{print max}' buddhi)
max2=$(awk '{max=length($0) > max ? length($0) : max}END{print max}' lw)

while IFS='@' read -r col1 col2 col3
do
    printf "${ORANGE}%-*s ${BLUE}%-*s ${RED}%s\n" "${max1}" "${col1}" "${max2}" "${col2}" "${col3}"
done < <(paste -d"@" buddhi lw buddhi)

printf "${GREEN}"
printf "============================\n"

这就产生了:

票数 1
EN

Stack Overflow用户

发布于 2021-12-21 17:15:21

如果您需要更短的版本:

代码语言:javascript
复制
printf "$GREEN=================================\n"
{ figlet Buddhi; echo 'EOF'; figlet LW; } | awk 'NF==1&&$1=="EOF" {noskip=1; next; } noskip==0 { f[++c]=$0; next; } { printf "%s%s%s%s\n","'"$ORANGE"'",f[++k],"'"$BLUE"'",$0;}'
printf "$GREEN=================================\n"
tput sgr0

我建议使用tput来设置颜色,因为不是每个终端都知道转义序列。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70438735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档