入力色付きの列を使用するには?

入力色付きの列を使用するには?

入力色を使用すると、熱出力を妨げるようです。なぜこれが起こり、もっと重要なのは解決策がありますか?

$ {
  echo "$(tput bold)foo$(tput sgr0)" "$(tput bold)bar$(tput sgr0)"
  echo bar foo
} | column -t
foo  bar
bar                     foo

macosとubuntu 20.04で問題を再現しましたが、どちらもBSD列を使用しているようです。

ベストアンサー1

パイプを使用すると、cat -vそのファイルストリームのすべての文字を表示できます。column幅を計算するために使用します。

^[[1mfoo^[(B^[[m ^[[1mbar^[(B^[[m
bar foo

正しいアプローチは、すべてのコンテンツ生成をすべての形式(MVCモデルなど)から分離することです。タブなどの出力を生成するためにスペースが追加されるため、column内容が変更されます。また、tput端末にコマンドを追加します。これらの操作を分離することで、出力をファイルに保存したり、フォーマット機能から渡したり、コンソールに送信したり、他のターゲット用にフォーマットしたりできます。


しかし、幅の計算から特定の文字を除外するのもawk良い練習です。column -t以下で使用する正規表現は多くをtput捉えますが、すべてではないことはほとんど確信しています。

$ cat tst.awk
BEGIN {
    OFS = "  "
}

{
    nr = NR
    for (i=1;i<=NF;i++) {
        f[NR,i] = $i
        gsub(/\x1B[^[:alpha:]]+[[:alpha:]]/,"",$i)
        if (length($i) > col[i]) col[i] = length($i)
    }
}

END {
    for (i=1;i<=nr;i++) {
        for (j=1;j<=length(col);j++) {
            printf "%-"col[j]"s%s", f[i,j], (j==length(col)? ORS : OFS)
        }
    }
}

次に、最初の出力をパイプに接続します。awk -f tst.awk

おすすめ記事