使用sed仅用一个模式替换所有出现的事件

时间:2016-04-04 14:39:00

标签: shell replace sed

我编写了一个shell脚本,在/ etc / ssh / sshd_config中将GSSAPIAuthentication设置为no。

在我的脚本中,我有这一部分:

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 no - > GSSAPIAuthentication no

#GSSAPIAuthentication yes - > GSSAPIAuthentication no

GSSAPIAuthentication yes - > GSSAPIAuthentication no

所以我有GSSAPIAuthentication no的多行。如何将此更改为只有一行GSSAPIAuthentication no?

感谢。

1 个答案:

答案 0 :(得分:0)

我建议使用awk来执行此操作:

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

这将替换包含" GSSAPIAuthentication"的行的第一个实例。与期望的替代品。对于与模式匹配的后续行,!seen++将为true,因此不会打印它们,next会跳到下一条记录。最后的1始终为true,因此会打印其他行。

要覆盖现有文件,请使用标准模式awk '...' /etc/ssh/sshd_config > tmp && mv tmp /etc/ssh/sshd_config(但我确保这样做,直到您确定您对结果感到满意为止)。