sed не может заменить подстроку специальными символами - PullRequest
0 голосов
/ 17 сентября 2018

[Mac / Terminal] Я пытаюсь заменить слова в предложении их красными версиями. Я пытаюсь использовать sed, но он не выводит результат в формате, который я ожидаю. т.е.

for w in ${sp}; do
    msg=`echo $msg | sed "s/$w/\\033[1;31m$w\\033[0m/g"`
done

Результат:

033[1;31mstb033[0m 033[1;31mshu033[0m 033[1;31mkok033[0m

где $ sp - список подмножества слов, содержащихся в $ msg

желаемый результат будет выглядеть так:

\033[1;31mstb\033[0m \033[1;31mshu\033[0m \033[1;31mkok\033[0m

и тогда я надеюсь, что эхо -е правильно интерпретирует это и покажет красную окраску. Однако до сих пор я, похоже, не совсем правильно понимаю, как sed работает для достижения этой цели.

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Как насчет использования массива и printf вместо echo?

$ sp="Now is the time..."
$ w=( $sp )
$ printf -v output '\e[1;31m%s\e[0m ' "${w[@]}"
$ echo "$output"
Now is the time... 

Вывод явно красный, который здесь не встречается , но:

$ printf '%q\n' "$output"
$'\E[1;31mNow\E[0m \E[1;31mis\E[0m \E[1;31mthe\E[0m \E[1;31mtime...\E[0m '

А если вам не нравится конечный пробел, вы можете обрезать его с помощью ${output% }.

0 голосов
/ 17 сентября 2018

Это кажется чрезвычайно неэффективным.Почему вы просто не замените все слова за один раз и сразу не вставите действительные коды выхода?

sp='one two three'
msg='one little mouse, two little mice, three little mice'
echo "$msg" | sed -E "s/${sp// /|}/^[[1;31m&^[[0m/g"

Вывод (где я выделю жирным шрифтом, чтобы отметить красный цвет 1 ):

<b>one</b> little mouse, <b>two</b> little mice, <b>three</b> little mice

Опция sed -E просто позволяет нам использовать более простой синтаксис регулярных выражений (в Linux и некоторых других платформах попробуйте sed -r или просто переведите скрипт вPerl).

Вы должны набрать ctrl-V esc , где вы видите ^[ в командной строке выше.

Если вам нужносообщение в переменной для повторного использования, посмотрите на printf -v


1 Похоже Переполнение стека не поддерживает <span style="color:red">, к сожалению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...