Сбои вывода цвета Bash

sed G 
# option: g G    Copy/append hold space to pattern space.

G не часто используется, но хорош с этой целью. sed поддерживает два пространства буфера: “пространство шаблона” и “содержит пространство”. Строки, обработанные sed обычно, текут через пространство шаблона, поскольку различные команды воздействуют на его содержание (s///, p, и т.д.); пространство хранения начинается пустой и только используется некоторыми командами.

G команда добавляет новую строку и содержание пространства хранения к пространству шаблона. Вышеупомянутое sed программа никогда ничего не помещает в пространство хранения, таким образом, G эффективно добавляет просто новую строку к каждой строке, которая обрабатывается.

8
30.10.2017, 11:59
2 ответа

sed не рассматривает \e как escape-последовательность. С GNU sed и большинством других sed реализаций там, \e в s текст замены просто означает e. Единственные Escape обратной косой черты можно использовать портативно в s текст замены \\ означать обратную косую черту, \& означать литерал &, \/ (где / символ-разделитель) для литерала /, и \1 через \9 для обратных ссылок. GNU sed и BusyBox (но не, например, OpenBSD sed) добавляют \n для новой строки. Таким образом вывод Вашей команды sed имеет литерал e.

В ударе можно легко поместить литеральный символ ESC в переменные от запуска. \e одна из escape-последовательностей, распознанных $'…' создать.

ColorOff=$'\e[0m'       # Text Reset
BWhite=$'\e[1;37m'      # Bold White
11
27.01.2020, 20:09

Существует две проблемы в Вашем echo команда.

Я развернул переменные для краткости.

$ echo -e "test TEST test" | sed -e "s/TEST/\e[1;37mTEST\e[0m/g"
test e[1;37mTESTe[0m test

Первая проблема: обратные косые черты потеряны где-нибудь между sed волшебством и окружают волшебство. Необходимо выйти из них.

$ echo -e "test TEST test" | sed -e "s/TEST/\\e[1;37mTEST\\e[0m/g"
test e[1;37mTESTe[0m test

Все еще не работает. Возможно, больше выхода?

$ echo -e "test TEST test" | sed -e "s/TEST/\\\e[1;37mTEST\\\e[0m/g"
test \e[1;37mTEST\e[0m test

Finaly обратные косые черты проникают. Я понятия не имею, почему нам нужны три обратных косых черты, который является некоторым странным sed волшебством.

Вторая проблема: echo -e бессмысленно. -e включает интерпретацию Escape обратной косой черты, но всех echo -e добирается для интерпретации, "test TEST test". Escape обратной косой черты прибывают из sed, который не заботится о них и печатает их сырые данные.

То, что Вы хотите, является этим:

$ echo -e $(echo "test TEST test" | sed -e "s/TEST/\\\e[1;37mTEST\\\e[0m/g")
test TEST test

с полужирным ТЕСТОМ в выводе.

Вот полный сценарий с изменениями:

#!/bin/bash

ColorOff='\\\e[0m'       # Text Reset
BWhite='\\\e[1;37m'      # Bold White

string="test TEST test"
echo -e $(echo "$string" | sed -e "s/TEST/${BWhite}TEST${ColorOff}/g")
6
27.01.2020, 20:09
  • 1
    Btw, echo -e "${BWhite}AAAA${ColorOff}" шоу '\AAAA'. Жаль, потому что, чем я должен сохранить regular_color_constants и SED_color_constants. На самом деле я хочу иметь только regular_color_constants и зафиксировать эхо и sed опции получить то, что я хочу. –  ДМИТРИЙ МАЛИКОВ 23.08.2011, 17:02
  • 2
    То решение довольно хрупко (что, если $string содержит обратную косую черту?) и вполне немного более сложно, чем необходимый. Для понимания заключения в кавычки возьмите вещи по одному. Например, эти три обратных косых черты не являются sed волшебством вообще: сначала там удваивают кавычки, и "\\\e" две символьных строки \e; затем sed понимает \e как “символ e буквально”. –  Gilles 'SO- stop being evil' 24.08.2011, 01:25

Теги

Похожие вопросы