Экранирование символа '\' в строке замены в выражении 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