Экранирование символа '\' в строке замены в выражении sed

Я пытаюсь взять строку текста, как

    13) Check for orphaned Path entries

и измените его на (я хочу, чтобы цветовые коды bash окрашивали вывод, а не отображались на экране)

\033[32m*\033[0m Check for orphaned Path entries

с цветовыми кодами bash, чтобы раскрасить звездочку, чтобы она выделялась еще больше. У меня есть команда sed, которая выполняет большую часть этого, за исключением того, что она неправильно обрабатывает цветовые коды, так как видит их как ссылки на замещающий текст.

Что у меня так далеко:

sed "s/ *13) \(.*\)/ \033[32m*\033[0m \1/"

который выдает следующий вывод при запуске строки, которую я дал в начале:

   13) Check for orphaned Path entries33[32m*  13) Check for orphaned Path entries33[0m Check for orphaned Path entries

Он берет \0 из \033 и заменяет его исходной строкой. Удвоение обратной косой черты в замещающей строке не имеет значения; Я все еще получаю тот же текст на выходе.

Как вставить экранирование цвета bash в выражение замены sed?

6 ответов

Решение

Скорее всего, что sed вы используете не понимает восьмеричное, но может понимать шестнадцатеричное. Попробуйте эту версию, чтобы увидеть, работает ли она для вас (используя \x1b вместо \033):

sed "s/ *13) \(.*\)/ \x1b[32m*\x1b[0m \1/"

Ваш '\033' на самом деле один ESC (escape) символ, для вывода этого вы можете использовать любой из следующих:

  • \o033
  • \d027
  • \x1B
  • \c[ за CTRL-[

Удвойте обратную косую черту в строке замены, И используйте одинарные вместо двойных кавычек вокруг выражения sed:

sed 's/ *13) \(.*\)/ \\033[32m*\\033[0m \1/'

Это предотвращает вмешательство оболочки в поведение sed.

~~~~~~~

Обновить:

Используйте скрипт, чтобы добиться чистого цвета:

colorize.sh

#!/bin/sh

HIGHLIGHT=`echo -e '\033[32m'`
NORMAL=`echo -e '\033[0m'`

sed "s/ *13) \(.*\)/ $HIGHLIGHT*$NORMAL \1/" yourinputtext

У меня была такая же проблема, и я решил таким образом.

Вы можете попробовать изменить свой код:

sed "s/ *13) \(.*\)/ \033[32m*\033[0m \1/"

в это:

sed "s/ *13) \(.*\)/ $(echo '\033[32m')*$(echo '\033[0m') \1/"

Основная идея состоит в том, чтобы использовать "echo" для вывода команды escape. Это сработало для меня,

Я использую gawk

gawk -v string1=$STRING1 -v IGNORECASE=1 ' { gsub ( string1 , "\033[1m&\033[0m" ) ; print } '

Попробуй это:

sed  "s/ *13) \(.*\)/ \\\\033 \1/"

то есть косая черта-косая черта-033

Другие вопросы по тегам