Почему у Седа были проблемы с отображением моего приглашения PS1? - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь использовать sed как root, чтобы изменить значение по умолчанию PS1.

Первые 2 строки были только для того, чтобы убедиться, что синтаксис правильно структурирован, и посмотреть, что кавычки имеют значение, их последовательный запуск позволяет мне изменить комментарий в верхней части файла, а затем изменить его обратно. Открытие файла в nano подтверждает, что изменения вступили в силу, что должно исключать «права на запись».

sed -i 's/If not running interactively,/stringtoreplaceitwith/' /etc/skel/.bashrc
sed -i "s/stringtoreplaceitwith/If not running interactively,/" /etc/skel/.bashrc
sed -i "s/\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ /Replace PS1/" /etc/skel/.bashrc

Я не уверен, что это что-то еще в структуре строки, но по какой-то причине он не находит то, что я хотел бы заменить.

\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ 

(с завершающим пробелом).

sedPS1

1 Ответ

1 голос
/ 05 апреля 2019

Ваша проблема связана с цитированием и экранированием.Давайте уменьшим строку, которую вы пытаетесь заменить, до следующего:

\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
...