Вопрос по string, bash, sed, escaping – Экранирование символа '\' в строке замены в выражении sed

6

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

    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?

Это в основном одно и то же. Вот почему я уже удалил свой комментарий. balpha♦
Четверная обратная косая черта вызвала тот же эффект, что и использование одинарных кавычек и двойной удвоенной черты, как предложено @DreadPirateShawn. Я получаю вывод \ 033 [32m * \ 033 [0m прямо на консоль, не превращаясь в цветовые коды. Chris Lieb

Ваш Ответ

6   ответов
2

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

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

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

в это:

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

Основная идея состоит в том, чтобы использовать «echo»; распечатать команду выхода. Это сработало для меня,

0

Я использую gawk

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

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

\o033 \d027 \x1B \c[ for CTRL-[
+1 для восьмеричного префикса - большинство программ просто распознают ведущий ноль.
2

Удвойте обратную косую черту в строке замены, И используйте одинарные вместо двойных кавычек вокруг выражения 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
Только что увидел ваше обновление - я неправильно понял ваше & quot; измени его на & quot; string, то ... подумал, что это то, что вы хотели вывести. Хм ...
Хотя sed не пытается заменить \ 0 сейчас, я все еще не получаю цветной вывод. Chris Lieb
Если быть более точным, я получаю вывод \ 033 [32m * \ 033 [0m непосредственно на консоль, не превращаясь в цветовые коды Chris Lieb
PS - Мой сценарий работает, но ответ Денниса Уильямсона выполняет то же самое и намного короче. Используй его.
Не совсем уверен, что вы имеете в виду ... Моя цель состояла в том, чтобы решить проблему с побегом из \ apos; \ & apos; символ в строке замены, и сделал это - я получаю тот же выходной текст, который вы цитируете в своем & quot; измените его на & quot; строка выше. Кроме того, вы знаете, что ищете в цвете больше, чем я; Я просто хотел убедиться, что для этого у вас есть инструменты. :-)
9

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

sed "s/ *13) \(.*\)/ \x1b[32m*\x1b[0m \1/"
если это делает grok восьмеричным, используйте \ o033
@ Денис: Вы имеете в виду, что иногда у человека нет такого же руководства, как информация?
@Masi: так написано на странице руководства sed
@Hasturkun: Вот почему стоит прочитать информационный файл. Иногда человек просто не разрезает это. Спасибо за информацию.
-1

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

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

то есть slash-slash-slash-slash-033

Похожие вопросы