Есть ряд проблем.
Во-первых, брекеты {...}
в вашем выражении 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?