sed命令`s/\s+$//g`无法去除尾随空格,如何解决?
用sed去除尾随空格的正确方法
你的问题出在默认sed使用基础正则表达式(BRE),而你用的\s、+属于扩展正则表达式(ERE)的语法,默认不生效。以下是几种可行的解决方式:
方法1:启用扩展正则表达式(推荐)
添加-E选项(GNU sed也可使用-r,但-E是POSIX标准,兼容性更好),同时用[[:space:]]匹配所有空白字符(包括空格、制表符等),或直接用空格仅匹配空格:
# 匹配所有尾随空白字符(空格、制表符等) echo "'$(echo 'Magnetic ' | sed -E 's/[[:space:]]+$//')'" # 仅匹配尾随空格 echo "'$(echo 'Magnetic ' | sed -E 's/ +$//')'"
执行后会输出'Magnetic',成功去除尾随空格。
方法2:使用基础正则表达式语法(无需额外选项)
如果不想加-E,可以把+换成BRE里的\{1,\}(表示匹配1次及以上),同时搭配[[:space:]]或空格:
# 匹配所有尾随空白字符 echo "'$(echo 'Magnetic ' | sed 's/[[:space:]]\{1,\}$//')'" # 仅匹配尾随空格 echo "'$(echo 'Magnetic ' | sed 's/ \{1,\}$//')'"
方法3:针对GNU sed的简化写法
如果你用的是GNU sed(Linux系统默认),它支持\s匹配空白字符,加上-E即可:
echo "'$(echo 'Magnetic ' | sed -E 's/\s+$//')'"
补充说明
- 原命令里的
g修饰符多余,因为$已锚定行尾,只会匹配一次行尾空白,不需要全局替换。 - 若要同时处理换行符,可搭配
-n和p参数,或结合tr命令辅助,但通常sed的行尾匹配已能处理换行前的空格。
内容的提问来源于stack exchange,提问作者spraff
相关产品推荐
相关产品推荐

