sed中正则Plus量词失效:为何\s+替换命令无法生效?
问题原因解析
这是因为sed默认使用的是基本正则表达式(BRE),在BRE语法里,+只是普通字符,并不具备“匹配一个或多个前面元素”的量词功能。你写的\s+会被sed解析成“匹配一个空白字符,再匹配一个加号”,但你的目标文本里#PermitRootLogin后面只有空白没有加号,所以匹配失败。
而\s.*里的\s匹配单个空白,.*匹配后续所有内容,刚好贴合你的文本结构,因此能正常完成替换。
如果想让\s+生效,有两种解决方式:
- 给
+转义为\+,命令修改为:echo "#PermitRootLogin no" | sed 's/^#PermitRootLogin\s\+.*/PermitRootLogin yes/' - 使用
-E选项让sed启用扩展正则表达式(ERE),此时+无需转义就能作为量词使用:echo "#PermitRootLogin no" | sed -E 's/^#PermitRootLogin\s+.*/PermitRootLogin yes/'
至于regex101能正常运行该表达式,是因为它默认使用的是扩展正则表达式(ERE)或者Perl兼容正则表达式(PCRE),这些语法规范里+本身就具备量词的功能,不需要额外转义。
内容的提问来源于stack exchange,提问作者user603749
相关产品推荐
相关产品推荐

