用sed配置修改

时间:2016-07-19 18:35:59

标签: linux bash sed

对不起,这是一个快速的。我试图使用一个简单的sed命令修改ssh配置文件的值(作为执行许多功能的更大脚本的一部分)。我似乎无法弄清楚它为什么不起作用。以下是我要更改的配置行:

PermitRootLogin without-password

这是我的代码:

    sed 's/^\(PermitRootLogin\s*.\s*\).*$/\1Yes/' sshd_config

所以目标是用“是”替换“无密码”。它似乎工作,但我收到了这个:

PermitRootLogin wYes

2 个答案:

答案 0 :(得分:3)

试试这个:

sed 's/^\(PermitRootLogin \).*/\1Yes/' sshd_config

使用-i选项编辑文件

sed -i 's/^\(PermitRootLogin \).*/\1Yes/' sshd_config

您的模式正在捕获w,因为它是正则表达式.

中零或更多空格(\s*)之后的第一个字符(\s*.

答案 1 :(得分:2)

让我们分解正则表达式:

^\(PermitRootLogin\s*.\s*\).*$
  • ^匹配行的开头
  • \(启动捕获组
  • PermitRootLogin匹配该指令
  • \s*匹配指令
  • 之后的最长空格序列
  • .匹配空格后的第一个字符,即w
  • 开头的without-password
  • \s*匹配w之后的最长空格序列。由于那里没有空格,它与空字符串匹配。
  • \)结束捕获组

以上所有内容都会被放入捕获组1

  • .*匹配之后的所有内容。
  • $匹配该行的结尾。

因此,捕获组1包含PermitRootLogin w。然后将其复制到替换中,并添加Yes。结果是

PermitRootLogin wYes

我会用

sed 's/^PermitRootLogin\s.*$/PermitRootLogin Yes/' sshd_config

当您不需要将任何变量匹配复制到替换时,不需要捕获组。