对不起,这是一个快速的。我试图使用一个简单的sed命令修改ssh配置文件的值(作为执行许多功能的更大脚本的一部分)。我似乎无法弄清楚它为什么不起作用。以下是我要更改的配置行:
PermitRootLogin without-password
这是我的代码:
sed 's/^\(PermitRootLogin\s*.\s*\).*$/\1Yes/' sshd_config
所以目标是用“是”替换“无密码”。它似乎工作,但我收到了这个:
PermitRootLogin wYes
答案 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
当您不需要将任何变量匹配复制到替换时,不需要捕获组。