2016-04-04 2 views
0

Я запрограммировал сценарий оболочки, чтобы установить GSSAPIAuthentication в no/etc/ssh/sshd_config.Заменить все вхождения только одним шаблоном с помощью sed

В моем сценарии у меня этот раздел:

if [ $(grep "^GSSAPIAuthentication no$" /etc/ssh/sshd_config >/dev/null; echo $?) -ne 0 ]; then 
    sed -i 's/^[#]*GSSAPIAuthentication.*$/GSSAPIAuthentication no/g' /etc/ssh/sshd_config 
fi 

Это прекрасно работает, но он заменяет все вхождения в:

#GSSAPIAuthentication нет -> GSSAPIAuthentication нет

#GSSAPIAuthentication да - -> GSSAPIAuthentication no

GSSAPIAuthentication yes -> GSSAPIAuthentication no

Итак, у меня есть несколько строк с номером GSSAPIAuthentication no. Как я могу изменить это, чтобы иметь только одну строку с GSSAPIAuthentication no?

Спасибо.

ответ

0

Я предложил бы использовать AWK, чтобы сделать это:

awk '/GSSAPIAuthentication/ { if (!seen++) print "GSSAPIAuthentication no"; next } 1' file 

Это заменяет первый экземпляр строки, содержащей «GSSAPIAuthentication» с нужной замене. Для последующих строк, соответствующих шаблону, !seen++ будет истинным, поэтому они не печатаются, и next переходит к следующей записи. 1 на конце всегда верно, поэтому печатаются другие строки.

Чтобы перезаписать существующий файл, используйте стандартный шаблон awk '...' /etc/ssh/sshd_config > tmp && mv tmp /etc/ssh/sshd_config (но я бы сохранил это, пока не установил, что вы довольны результатом).

+0

Это работает. Огромное спасибо. –

Смежные вопросы