Работа с escape-символами цвета bash ANSI в Ruby

Я работаю со следующей строкой:

\e[48;5;15mText\e[0m

Когда я печатаю строку с помощью оболочки bash, я получаю текст с раскрашенным фоном и передним планом. Я хочу манипулировать этой строкой (включая отдельные символы в управляющей последовательности) в Ruby. Когда я передаю эту строку из командной строки в Ruby или когда я использую ее непосредственно в своем скрипте Ruby, escape-символ «исчезает».

Скрипт Ruby

puts("\e[48;5;15mText\e[0m".chars.to_a)

Ожидаемый результат (точки обозначают пробелы)

 \
 e
 [
 4
 8
 ;
 5
 ;
 1
 5
 m
 T
 e
 x
 t
 \
 e
 [
 0
 m

Текущий вывод (точки обозначают пробелы)

 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 .
 T
 e
 x
 t
 .
 .
 .
 .
 .

Поскольку я использую строку в сценарии Ruby, и моя цель состоит в том, чтобы манипулировать строкой (включая escape-символы), я чувствую, что должен иметь возможность запускать escaped_string.chars.to_a в строке и получать вывод отдельных символов в этой строке. Я смог сделать это в сценариях bash и python без проблем.

Вопросы
1. Почему я не вижу эти escape-символы?
2. Какие настройки нужно включить, чтобы "видеть" эти escape-символы?


person Dodzi Dzakuma    schedule 18.12.2014    source источник
comment
Каков ваш ожидаемый результат?   -  person Stefan    schedule 18.12.2014
comment
Я обновил вопрос с моим ожидаемым результатом.   -  person Dodzi Dzakuma    schedule 18.12.2014


Ответы (2)


Вы не видите escape-символов, потому что эмулятор терминала перехватывает их для изменения цвета и прочего и не печатает их. В этом весь смысл escape-символов. Почти всегда нет «настроек», которые вы можете изменить, чтобы заставить эмулятор терминала распечатать их, но это, очевидно, зависит от того, какой именно эмулятор вы используете.

Вместо этого можно было бы увидеть символы следующим образом:

"\e[48;5;15mText\e[0m".chars.each {|char| p char }
person Adrian    schedule 18.12.2014
comment
Я получаю то же самое, если пытаюсь отобразить символы с помощью этого метода. - person Dodzi Dzakuma; 18.12.2014
comment
Вы имеете в виду, что вы получаете тот же результат? Такого быть не должно, вы точно скопировали мой код? - person Adrian; 18.12.2014
comment
Моя ошибка. Я побежал escaped_string.chars.each { |char| puts(char)}. Что дало мне вывод выше. То, что вы написали, работает, однако это не позволяет мне манипулировать символами в строке. - person Dodzi Dzakuma; 19.12.2014
comment
Я посмотрел на ваш ожидаемый результат. Чтобы получить это, попробуйте "\e[48;5;15mText\e[0m".gsub("\e", "\\e").chars.each {|char| puts char }. Я думаю, что вы неправильно понимаете тот факт, что символ \e является одним символом и никоим образом не является комбинацией \ и e. - person Adrian; 19.12.2014

Это не просто escape-символы, это последовательность символов.
Вместо этого попробуйте следующее:

puts("\e[48;5;15m")
puts("Text".chars.to_a)
puts("\e[0m")

Ваш существующий код эффективно печатает это:

puts("\e\n[\n4\n8\n;\n5\n;\n1\n5\nm\nT\ne\nx\nt\n\e\n[\n0\nm")

Таким образом, последовательность escape-символов нарушена.

person anishsane    schedule 18.12.2014
comment
Я предполагаю, что \n это кареты. В таком случае то, что вы написали, это именно то, что я хотел бы напечатать. Однако печатается puts(" \n \n \n \n \n \n \n \n \n \nT\ne\nx\nt\n \n \n \n "). - person Dodzi Dzakuma; 19.12.2014