
私が作業しているスクリプトは複数の列で構成されたカラーテーブルを表示しますが、カラーコーディングは書式設定を妨げます。一部の列の色は行ごとに異なるため、カラーコードをフォーマット文字列に移動することはできません。関連するQ&A(下記参照)には回避策は記載されていません。以下に簡単な例と解決策を提供しました。
私の実際の使い方は、複数のjpgファイルを繰り返し、さまざまなEXIFデータを解析し、結果をテーブルの行に出力しながら生成された異なる色の異なる列を持つ11個の列テーブルを表示するbashスクリプトです。 EXIF分析の結果によってソートされた行とも異なります。
しかし、前述したように、以下に簡単な回避策の例を提供しました。
以下は、問題を示す単純化された表示テーブルの断片です。
# RedBlk defined in .bashrc.local as RedBlk="^[[0;31;40m"
# DefDef defined in .bashrc.local as DefDef="^[[0m"
(GrnBlk=$(tput setaf 2)
YelBlk="\e[1;33m"
echo "123456789 123456789"
for ii in {8..13}; do
case $ii in
8|9) clr1=""; clr2="";;
11) clr1=$RedBlk; clr2="";;
12) clr1=$YelBlk; clr2=$GrnBlk;;
*) clr1=$GrnBlk; clr2=$RedBlk;;
esac
printf "%6d %6b$DefDef %6b\n" $((ii*2)) $clr1$ii $clr2$((ii*4))
done)
....出力:
123456789 123456789
16 8 32
18 9 36
20 10 40
22 11 44
24 12 48
26 13 52
"^[[0;31;40m"
またはを使用すると、$(tput setaf 2)
同じ問題が発生する可能性があります。"\e[1;33m"
これはあまりにも単純化された例です。
(echo "123456789 123456789 123456789"
printf "%20s\n" "Hello""Again"
printf "%20s\n" $RedBlk"Hello"$DefDef"Again"
)
....出力:
123456789 123456789 123456789
HelloAgain
HelloAgain
2つのソリューション1)フィールドの幅を変更し(例:過度に単純化された例では=から=に20
)、2)文字列を分割してフォーマットを変更します。20+${#RedBlk}+${#DefDef}
20+10+4
(echo "123456789 123456789 123456789"
printf "%20s\n" "Hello""Again"
printf "%34s\n" $RedBlk"Hello"$DefDef"Again"
printf "%s%15s%s%s\n" $RedBlk "Hello" $DefDef "Again"
)
....出力:
123456789 123456789 123456789
HelloAgain
HelloAgain
HelloAgain
しかし、実際の使用を考慮すると、両方のソリューションは非常に不器用です。
次のQ&Aは関連していますが、解決策は提供しません。
https://stackoverflow.com/questions/67638971/how-to-get-color-and-width-formatting-with-printf
https://stackoverflow.com/questions/58519511/bash-printf-formated-output-with-colors
https://stackoverflow.com/questions/5412761/using-colors-with-printf
カラーコードがあるときにprintfと%sをどのように使用しますか?
より簡単な解決策は何ですか?
これが私が使用するものです:
bash --version
GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)
# which printf
/usr/bin/printf
# /usr/bin/printf --version
printf (GNU coreutils) 8.26
# /usr/bin/xterm -version
XTerm(327)
答え1
1つの解決策は、ループが繰り返されるたびにフォーマット文字列を動的に生成することです。
fmt=`printf "%b" "%6d "$clr1"%6d$DefDef "$clr2"%6d"$DefDef`
printf "$fmt\n" $((ii*2)) $ii $((ii*4))
いっぱい:
(DefDef=$(tput init)
RedBlk=$(tput setaf 1)
GrnBlk=$(tput setaf 2)
YelBlk="\e[1;33m"
echo "123456789 123456789"
for ii in {8..13}; do
case $ii in
8|9) clr1=""; clr2="";;
11) clr1=$RedBlk; clr2="";;
12) clr1=$YelBlk; clr2=$GrnBlk;;
*) clr1=$GrnBlk; clr2=$RedBlk;;
esac
fmt=`printf "%b" "%6d "$clr1"%6d$DefDef "$clr2"%6d"$DefDef`
printf "$fmt\n" $((ii*2)) $ii $((ii*4))
done)
....出力:
123456789 123456789
16 8 32
18 9 36
20 10 40
22 11 44
24 12 48
26 13 52
答え2
別の解決策は、各フィールドを同じ長さCOLOR_ON(color)
とCOLOR_OFF
シーケンス(color
通常black
)で囲むことです。これまで作業してください。