Рейтинг:0

sed с экранированием цвета ANSI не работает

флаг in

Я не знаю, почему это не работает:

echo -e "$(echo "Это неокрашенный текст" | sed "s/{Это неокрашенный текст}/{Это \033[0;34неокрашенный текст\033[0m}/g")"

но это работает хорошо:

echo "$(echo "Hello World" | sed "s/Hello/Hi/g")"

Можете ли вы объяснить мне?

Bodo avatar
флаг pt
Пожалуйста, [отредактируйте] свой вопрос и объясните, что именно вы имеете в виду под «это не работает». Какой фактический результат вы получаете? Что вы хотите получить?
Bruno Henrique Peixoto avatar
флаг in
Следующая команда: start_command echo "это неокрашенный текст" | sed 's/Это неокрашенный текст/Это \033\[0;34неокрашенный текст\033\[0m/g' end_commend по-прежнему не работает
Bruno Henrique Peixoto avatar
флаг in
Не могли бы вы вставить окончательный результат. Я не получаю его только заменой ```[``` на ```\[```
Bruno Henrique Peixoto avatar
флаг in
Исходная задача берет неокрашенную строку и заменяет ее окрашенной. Однако, как видите, в цветной версии отсутствуют некоторые символы обратной косой черты.
Bruno Henrique Peixoto avatar
флаг in
Проблема решена!
Рейтинг:2
флаг hr

Есть ряд проблем.

Во-первых, брекеты {...} в вашем выражении sed ничего не соответствует входным данным. В базовом регулярном выражении sed фигурные скобки являются буквальными, а в расширенном регулярном выражении они окружают квантификатор формы {н, м}. Они никогда не используются для группировки.

Во-вторых, ваша цветовая последовательность искажена — открытие должно быть \033[0;34м скорее, чем \033[0;34

В-третьих, символ обратной косой черты \ является особенным в sed - в частности, обратная косая черта, за которой следует десятичная цифра в правой части подстановки, является обратной ссылкой на группу захвата; по крайней мере в GNU sed, \0 относится ко всему захваченному LHS, эквивалентному специальному токену замены & так например

$ эхо-фу | sed 's/foo/\033bar/'
foo33bar

Чтобы передать литерал \ к внешнему эхо -е вам нужно \\ внутри строки замены sed.

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

echo -e "$(echo "Это неокрашенный текст" | 
  sed "s/Это неокрашенный текст/Это \033[0;34бесцветный текст\033[0m/")"

или (заменив внутренние двойные кавычки «сильными» одинарными кавычками):

echo -e "$(echo "Это неокрашенный текст" | 
  sed 's/Это неокрашенный текст/Это \033[0;34бесцветный текст\033[0m/')"

Обратите внимание, что вам не нужно г модификатор, чтобы сделать одну замену в строке.

Смотрите также Какие символы мне нужно экранировать при использовании sed в скрипте sh?

Bruno Henrique Peixoto avatar
флаг in
Я выбрался наружу. Взгляните на ответ ниже.
Рейтинг:0
флаг in

Мое разработанное решение:

#!/бин/баш

color_text='это \033[0;34mtext\033[0m'
uncolored_text='это текст'

printf %b\n "$(sed "s/$uncolored_text/$colored_text/" <<< "$uncolored_text")"

Bruno Henrique Peixoto avatar
флаг in
Спасибо, bac0n! Хорошо пахнет.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.