2014-10-27 3 views
0

Я пытаюсь прокомментировать строку в /etc/sudoers через скрипт оболочки. Это соответствующая линия, которую я хотел бы изменить:Sed: Как заменить строку, которая содержит несколько специальных символов?

# grep '\!requiretty' /etc/sudoers 
Defaults:nagios !requiretty 

Но, похоже, шаблон я использую с sed неверен, мои попытки:

# sed -i 's/^Defaults\:nagios$/#Defaults:nagios !requiretty/g' /etc/sudoers 
# sed -i 's/^Defaults:nagios$/#Defaults:nagios !requiretty/g' /etc/sudoers 
# sed -i 's/^Defaults:nagios$/#Defaults:nagios !requiretty/g' /etc/sudoers 
# sed -i 's/^Defaults:nagios$/\#Defaults:nagios !requiretty/g' /etc/sudoers 
# sed -i 's/^Defaults:nagios$/\#Defaults:nagios \!requiretty/g' /etc/sudoers 
# sed -i 's/^Defaults:nagios$/^#Defaults:nagios !requiretty/g' /etc/sudoers 
# sed -i 's/^Defaults\:nagios$/^#Defaults:nagios !requiretty/g' /etc/sudoers 
# sed -i 's/^Defaults\:nagios$/#Defaults:nagios \!requiretty/g' /etc/sudoers 

Ни один из выше работал. ..

Может кто-нибудь, пожалуйста, помогите мне с правильным регулярным выражением?

Заранее спасибо

+2

Из вашего описания не ясно мне, что линия выглядит, как и раньше, и что он будет после редактирования. Также важно знать, как выглядят другие строки. Если нет аналогичного файла, регулярное выражение может быть намного проще ... Совет: при разработке регулярного выражения начинайте с простейшей части и добавляйте детали шаг за шагом. Таким образом, вы узнаете, какая часть работает. –

ответ

1

Ну ... sudoers не предназначен быть доступны для записи кем-либо - даже корень. Вы должны изменить его с помощью команды visudo вместо этого по соображениям безопасности.

Я думаю, вы можете иметь его в обратном направлении, хотя первая часть sed заменяет . Вторая часть - замена. Таким образом, вы хотели бы сделать что-то вроде:

sed -i 's/^Defaults:nagios !requiretty$/#Defaults:nagios/' 

Это будет также удалить requiretty. Если все, что вы хотите, чтобы добавить # вы можете просто сделать:

sed -i 's/^Defaults:nagios !requiretty$/#&/' 
+0

Спасибо за ваш ответ, ваша вторая команда - тот, который я искал. Поддерживает ли '' '' шаблон 'find' sed? –

+0

@ItaiGanot в значительной степени - это нулевой матч или что-то, что соответствовало шаблону. Вы также можете использовать '\ 1' и т. Д. Для других групп захвата, но вы не выполняете захват с помощью этого шаблона. –