sed G
# option: g G Copy/append hold space to pattern space.
G
не часто используется, но хорош с этой целью. sed поддерживает два пространства буфера: “пространство шаблона” и “содержит пространство”. Строки, обработанные sed обычно, текут через пространство шаблона, поскольку различные команды воздействуют на его содержание (s///
, p
, и т.д.); пространство хранения начинается пустой и только используется некоторыми командами.
G
команда добавляет новую строку и содержание пространства хранения к пространству шаблона. Вышеупомянутое sed программа никогда ничего не помещает в пространство хранения, таким образом, G
эффективно добавляет просто новую строку к каждой строке, которая обрабатывается.
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
Существует две проблемы в Вашем 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")
echo -e "${BWhite}AAAA${ColorOff}"
шоу '\AAAA'. Жаль, потому что, чем я должен сохранить regular_color_constants и SED_color_constants. На самом деле я хочу иметь только regular_color_constants и зафиксировать эхо и sed опции получить то, что я хочу.
– ДМИТРИЙ МАЛИКОВ
23.08.2011, 17:02
$string
содержит обратную косую черту?) и вполне немного более сложно, чем необходимый. Для понимания заключения в кавычки возьмите вещи по одному. Например, эти три обратных косых черты не являются sed волшебством вообще: сначала там удваивают кавычки, и "\\\e"
две символьных строки \e
; затем sed понимает \e
как “символ e
буквально”.
– Gilles 'SO- stop being evil'
24.08.2011, 01:25