Plus量词在sed中使用正则表达式进行替换时未按预期工作



输入为#PermitRootLogin no. 为什么下面的sed表达式不能用于sed?

echo "#PermitRootLogin no" | sed 's/^#PermitRootLogins+.*/PermitRootLogin yes/'

但在我删除关键字后的+它工作吗?

echo "#PermitRootLogin no" | sed 's/^#PermitRootLogins.*/PermitRootLogin yes/'

我以为+after as表示一个或多个先前的标记。

sed要点

PS: regex101.com

您必须转义+符号:

在GNU sed中,这些字符?,+,括号,大括号({})|没有特殊的含义,除非加上反斜杠作为前缀。

加号+在您的情况下意味着匹配字面量+,所以它将匹配#PermitRootLogin +no中的加号。您必须在s+中转义它才能匹配一个或多个空白字符#PermitRootLogin no

echo "#PermitRootLogin no" | sed 's/^#PermitRootLogins+.*/PermitRootLogin yes/'

输出:

PermitRootLogin yes

最新更新