Ваша проблема связана с цитированием и экранированием.Давайте уменьшим строку, которую вы пытаетесь заменить, до следующего:
\w\[\033[00m\]\$
(с завершающим пробелом) - содержит все трудности, но менее многословно.
Чтобы соответствовать этомунам нужно
- экранировать все обратные слэши:
\w
становится \\w
и т. д. - экранировать
[
и ]
, потому что они особенные для sed:[
становится \[
, а \[
становится \\\[
(экранированный обратный слеш, экранированный [
) - escape
$
: \$
становится \\\$
Затем мы должны использовать одинарные кавычки вокруг нашей команды sed, чтобы оболочка не изменяла строку:
$ sed 's/\\w\\\[\\033\[00m\\\]\\\$ /Replace PS1/' <<< '\w\[\033[00m\]\$ '
Replace PS1
Она также может работать с двойными кавычками, но тогда мынеобходимо добавить еще один раунд выхода для оболочки: \[
становится \\\[
(экранированным для sed) становится \\\\\\[
(экранированным для оболочки) и т. д.
$ sed "s/\\\\w\\\\\\[\\\\033\\[00m\\\\\\]\\\\\\$ /Replace PS1/" <<< '\w\[\033[00m\]\$ '
Replace PS1
Двойные кавычки имеют смысл, только если вы используете переменные по понятным причинам.
Наконец, для вашей фактической строки:
$ echo '\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' \
| sed 's/\\\[\\033\[01;32m\\\]\\u@\\h\\\[\\033\[00m\\\]:\\\[\\033\[01;34m\\\]\\w\\\[\\033\[00m\\\]\\\$ /Replace PS1/'
Replace PS1