Problem mit Spaltenbefehl und Farb-Escape-Codes

7

Ich färbe den Header einer mit formatierten Tabelle ein column -ts $'\t'

Funktioniert gut ohne Farbcodes, aber wenn ich der ersten Zeile Farbcodes hinzufüge, wird columndie Ausgabe nicht richtig ausgerichtet.

Ohne farbige Ausgabe funktioniert es wie erwartet :
printf "1\t2\t3\nasdasdasdasdasdasdasd\tqwe\tqweqwe\n" | column -ts $'\t'

Wenn Sie jedoch Farbe in die Spalte der ersten Zeile einfügen, wird der Text der farbigen Zeile nicht ausgerichtet:
printf "\e[7m1\t2\t3\e[0m\nasdasdasdasdasdasdasd\tqwe\tqweqwe\n" | column -ts $'\t'

Beobachtet dieses Verhalten sowohl unter Ubuntu Linux als auch unter Mac OS X.

Niklas Berglund
quelle

Antworten:

3

Ich stelle mir vor, das columnweiß nicht, dass \e[7mes sich um eine v100-Escape-Sequenz handelt, die keinen Platz in der Ausgabe beansprucht. Es scheint anzunehmen, dass die Zeichencodes 0 bis 037 Oktal keinen Platz beanspruchen. Sie können das bekommen, was Sie wollen, indem Sie die anfängliche Escape-Sequenz in eine eigene Zeile setzen und dann diese neue Zeile aus der Ausgabe entfernen:

printf '\e[7m\n1\t2\t3\e[0m\nasdasdasdasdasdasdasd\tqwe\tqweqwe\n' | 
column -ts $'\t' |
sed '1{N;s/\n//}'
meuh
quelle
Vielen Dank! Du hast recht. Verwenden Sie auch Farben in einigen Spalten anderer Zeilen, in denen diese Problemumgehung für Zeilenumbrüche nicht funktioniert, aber ich werde dies mit der von @terdon vorgeschlagenen Methode umgehen.
Niklas Berglund
5

Ja, das liegt daran, dass die Farbcodes auch von formatiert werden column. Sie sind Charaktere wie alle anderen. Da Sie es jedoch bereits verwenden printf, können Sie es auch verwenden, um die Formatierung für Sie vorzunehmen:

$ printf '\e[7m%-24s%-8s%-6s\e[0m\n%-24s%-8s%-6s\n' "1" "2" "3" "asdasdasdasdasdasdasd" "qwe" "qweqwe"
1                       2       3     
asdasdasdasdasdasdasd   qwe     qweqwe

Alternativ können Sie die Farbcodes hinzufügen, nachdem Sie Folgendes verwendet haben column:

$ printf "1\t2\t3\nasdasdasdasdasdasdasd\tqwe\tqweqwe\n" | column -ts $'\t' | 
    sed "1{s/^/$(printf '\e[7m')/;s/$/$(printf '\e[0m')/}"
1                      2    3   # this line is colored
asdasdasdasdasdasdasd  qwe  qweqwe
terdon
quelle
Ja, es sind Zeichen, aber nicht das Tabulatorzeichen \ t, das ich als Trennzeichen angegeben habe :) Ich möchte nicht printf verwenden, um die Länge anzugeben, ich möchte Spalten erstellen mitcolumn
Niklas Berglund
@NiklasBerglund ja, aber es macht keinen Sinn, die Registerkarte zu verwenden, da Ihr columnBefehl sie entfernt.
Terdon
@NiklasBerglund siehe auch aktualisierte Antwort. Sie können die Farben nach Verwendung der Spalte hinzufügen und das Problem vermeiden.
Terdon
Vielen Dank. Ich möchte verwenden, columnweil einige Spalten eine dynamische Breite haben. columnGute Idee, Farben nach der Verwendung von 👍 hinzuzufügen
Niklas Berglund