Что не так с моей заменой строк с помощью sed в Mac OS X?

Я хочу заменить #Banner none на Banner /etc/sshd_banner, который находится внутри /etc/sshd_config. Если я запустил

sudo sed -i "s/#Banner none/Banner \/etc\/sshd_banner" /etc/sshd_config

Я получаю следующую ошибку

sed: 1: "/etc/sshd_config": unterminited substitute pattern

Любые идеи по устранению этой проблемы?

Ответ 1

Используйте другой разделитель

Экс здесь я использую " разделитель рекламы

sudo sed -i "" "s|#Banner none|Banner /etc/sshd_banner|" /etc/sshd_config

Изменяя разделитель, вам не нужно выходить из /

Ваш оригинальный пост пропустил один / в конце.

Из руководства по OS X

-i extension
         Edit files in-place, saving backups with the specified extension.  If a zero-length extension
         is given, no backup will be saved.  It is not recommended to give a zero-length extension when
         in-place editing files, as you risk corruption or partial content in situations where disk
         space is exhausted, etc.

zero-length= ""

Ответ 2

Три проблемы с вашей командой:

  • Вам не хватает завершающего /.
  • Вы не можете использовать / как разделитель, так как этот символ встречается в строке, которую вы пытаетесь заменить/заменить. В качестве разделителя вы должны использовать другой символ, такой как символ трубы.
  • В версии (BSD) sed, которая поставляется с Mac OS X, флаг -i ожидает обязательный аргумент <extension>, который отсутствует в вашей команде. Пустая строка ("") должна следовать за флагом -i, если вы хотите отредактировать файл на месте с помощью этой версии sed.

В общем, попробуйте

sudo sed -i "" "s|#Banner none|Banner /etc/sshd_banner|" /etc/sshd_config

Ответ 3

Попробуйте одинарные кавычки. Кроме того, некоторые Seds требуют, чтобы вы экранировали первый разделитель, если хотите использовать что-то отличное от /.

sudo sed -i 's\:#Banner none:Banner :etc/sshd_banner:' /etc/sshd_config

Еще одна вещь заключается в том, что #, возможно, интерпретируется как комментарий, который продолжается до конца строки.