Что не так с моей заменой строк с помощью 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
Еще одна вещь заключается в том, что #
, возможно, интерпретируется как комментарий, который продолжается до конца строки.