カラーコードはprintfをxtermテーブル形式で混乱させます。

カラーコードはprintfをxtermテーブル形式で混乱させます。

私が作業しているスクリプトは複数の列で構成されたカラーテーブルを表示しますが、カラーコーディングは書式設定を妨げます。一部の列の色は行ごとに異なるため、カラーコードをフォーマット文字列に移動することはできません。関連する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

おすすめ記事