You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 11:15:58