Я не согласен с вашей характеристикой «9 пробелов после зелёного зелёного».Я использую Perl, а не Ruby, но если я использую модификацию вашего оператора, печатая символ канала после строки, я получаю:
perl -e 'printf "%20s|\n%20s|\n", "\033[32mGreen\033[0m", "Green";'
Green|
Green|
Это показывает мне, что оператор printf()
насчитывал 14 символовв строке, поэтому к нему добавляется 6 пробелов, чтобы получить 20 символов по правому краю.Тем не менее, терминал проглотил 9 из этих символов, интерпретируя их как изменение цвета.Итак, вывод оказался на 9 символов короче, чем вы хотели.Тем не менее, printf()
не печатал 9 пробелов после первого «зеленого».
Что касается лучших практик для выровненного вывода (с колоризацией), я думаю, вам нужно будет иметь каждый размер-и выровненное поле, окруженное простыми полями '% s', которые имеют дело с колоризацией:
printf "%s%20.20s%s|%s%-10d%s|%s%12.12s%s|\n",
co_green, column_1_data, co_plain,
co_blue, column_2_data, co_plain,
co_red, column_3_data, co_plain;
Где, очевидно, co_XXXX
переменные (константы?) содержат escape-последовательности для переключения на названный цвет(и co_plain
может быть лучше, чем co_black
).Если выясняется, что для какого-то поля вам не нужна колоризация, вы можете использовать пустую строку вместо co_XXXX
переменных (или назвать ее co_empty
).