sed匹配并替换文件,注释除外

时间:2015-08-22 18:57:31

标签: regex bash sed

我正在尝试通过root自动禁用登录SSH。我知道我可以手动编辑文件并执行此操作,但我想通过Bash脚本(我用来初始化服务器)禁用root登录。

我还没有使用sed,但我认为它应该基于this question使用。

我要在/etc/ssh/sshd_config中替换的行是PermitRootLogin {any_value}{any_value}的默认值为yes,但我希望这适用于任何值(在同一行)。

我尝试了sudo sed -i "/PermitRootLogin/c\PermitRootLogin no" /etc/ssh/sshd_config命令,但这也取代了包含文本" PermitRootLogin"的随机注释。

因此,我不想替换以评论标记#开头的行。

以下是我要编辑的文件的相关部分(我的评论添加了" ###"):

# Authentication:
LoginGraceTime 120
PermitRootLogin yes ### I want to replace this line with "PermitRootLogin no"
StrictModes yes

# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without

预期输出为:

LoginGraceTime 120
PermitRootLogin no
StrictModes yes

# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without

然后,我尝试了这个:sed -i "\(^[\# ]\)+/PermitRootLogin/c\PermitRootLogin no" /etc/ssh/sshd_config

这给了我一个错误:sed: -e expression #1, char 48: unterminated address regex

我怎样才能完成我想做的事情?谢谢!

3 个答案:

答案 0 :(得分:3)

尝试

sed -i "s/^[^#]*PermitRootLogin .*/PermitRootLogin no/g" file

^: Beginning of line
[^#]*: any character but no #

答案 1 :(得分:2)

您可以使用:

public void setTableAlignment(XWPFTable table, STJc.Enum justification) {
    CTTblPr tblPr = table.getCTTbl().getTblPr();
    CTJc jc = (tblPr.isSetJc() ? tblPr.getJc() : tblPr.addNewJc());
    jc.setVal(justification);
}

模式sed '/^#/!s/PermitRootLogin .*/PermitRootLogin no/' /etc/ssh/sshd_config 匹配以注释开头的行。 /^#/否定匹配意味着后续命令将仅在非注释行上执行。

替代评论将!替换为PermitRootLogin .*后的PermitRootLogin no

一旦确定它正常工作,请使用-i

答案 2 :(得分:2)

尝试使用GNU sed:

sed -i 's/^PermitRootLogin .*/PermitRootLogin no/' /etc/ssh/sshd_config