簡體   English   中英

我想連接兩個 figlet 輸出(具有不同的顏色)

[英]I would like to concatenate two figlet outputs (with different colors)

目前我有這種 output 格式:

{ echo "$(figlet buddhi)"; echo "$(figlet lw)"; }
 _               _     _ _     _
| |__  _   _  __| | __| | |__ (_)
| '_ \| | | |/ _` |/ _` | '_ \| |
| |_) | |_| | (_| | (_| | | | | |
|_.__/ \__,_|\__,_|\__,_|_| |_|_|

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


我想要這個 output 格式:

figlet buddhi lw
 _               _     _ _     _   _
| |__  _   _  __| | __| | |__ (_) | |_      __
| '_ \| | | |/ _` |/ _` | '_ \| | | \ \ /\ / /
| |_) | |_| | (_| | (_| | | | | | | |\ V  V /
|_.__/ \__,_|\__,_|\__,_|_| |_|_| |_| \_/\_/

原因是:我想用不同的顏色為每個名字(buddhi,lw)着色。 但是,保留連續字符串的格式,或最大空間分隔,如上。

例子:

 #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}"

將 arrays、output 和 arrays 中的每個單詞的行逐行存儲。 由於“Buddhi”的第一行似乎短了一個字符,所以我將第一個單詞的最長行長度存儲在一個變量中,並使用%-s格式填充每一行。

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

代替figlet我將使用以下內容作為我的輸入:

$ cat buddhi
 _               _     _ _     _
| |__  _   _  __| | __| | |__ (_)
| '_ \| | | |/ _` |/ _` | '_ \| |
| |_) | |_| | (_| | (_| | | | | |
|_.__/ \__,_|\__,_|\__,_|_| |_|_|

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

假設figlet為每個輸入字符串生成相同數量的 output 行,我們可以使用paste@作為分隔符)和while/read循環來生成所需的 output:

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 個輸入流:

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"

這會產生:

在此處輸入圖像描述

如果您需要更短的版本:

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 設置顏色,因為並非每個終端都會知道您的轉義序列

發明 shell 的人也發明了 awk 為 shell 調用操作文本。 這些轉義序列不會改變我終端上的 colors ,它們只是按原樣顯示(幸運的是,您可以看到腳本將它們放在哪里):

$ cat tst.sh
#!/usr/bin/env bash

awk '
    BEGIN {
        red =    "\\e[31m"
        orange = "\\e[33m"
        blue =   "\\e[94m"
        green =  "\\e[92m"
        stop =   "\\e[0m"
    }
    {
        val[(NR==FNR),FNR] = $0
    }
    NR == FNR {
        wid = length($0)
        maxWid = ( wid > maxWid ? wid : maxWid )
    }
    END {
        for ( lineNr=1; lineNr<=FNR; lineNr++ ) {
            printf "%s%-*s%s%s%s\n", orange, maxWid, val[1,lineNr], blue, val[0,lineNr], stop
        }
    }
' <(cat Buddhi) <(cat LW)

$ ./tst.sh
\e[33m _               _     _ _     _ \e[94m _\e[0m
\e[33m| |__  _   _  __| | __| | |__ (_)\e[94m| |_      __\e[0m
\e[33m| '_ \| | | |/ _` |/ _` | '_ \| |\e[94m| \ \ /\ / /\e[0m
\e[33m| |_) | |_| | (_| | (_| | | | | |\e[94m| |\ V  V /\e[0m
\e[33m|_.__/ \__,_|\__,_|\__,_|_| |_|_|\e[94m|_| \_/\_/\e[0m

由於我沒有figlet ,因此我在這些文件上運行了上述內容:

$ head Buddhi LW
==> Buddhi <==
 _               _     _ _     _
| |__  _   _  __| | __| | |__ (_)
| '_ \| | | |/ _` |/ _` | '_ \| |
| |_) | |_| | (_| | (_| | | | | |
|_.__/ \__,_|\__,_|\__,_|_| |_|_|

==> LW <==
 _
| |_      __
| \ \ /\ / /
| |\ V  V /
|_| \_/\_/

只需將腳本的最后一行更改為:

' <(cat Buddhi) <(cat LW)

' <(figlet Buddhi) <(figlet LW)

使用實際figlet output。

以上假設您只有 2 個figlet output 字符串要連接,並且兩組 output 長度相同,如果其中任何一個假設錯誤,則很容易調整。

使用坐標

#!/bin/bash

RED='\e[31m'
GRN='\e[32m'

XY(){ printf "\e[$2;${1}H$3"; }

mapfile -t frst < <(figlet -f standard "Buddhi")
mapfile -t scnd < <(figlet -f small    "LW")

XY 1 1 "$GRN==============================================="; y=2
for line in "${frst[@]}"; { XY 0  $y "$RED$line"; ((y++)); }; y=2
for line in "${scnd[@]}"; { XY 35 $y "$GRN$line"; ((y++)); }
XY 1 8 "$GRN==============================================="

在此處輸入圖像描述

更多示例在這里這里這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM