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

如何使用Bash将字符串中的多个连续空格替换为单个空格?

用Bash内部语法替换字符串中的多个相邻空格为单个空格

没问题,我来帮你实现纯Bash的多空格替换需求,不用调用任何外部程序!

核心方法:借助Bash的扩展通配符(extglob)

Bash本身支持参数扩展的全局替换,但要匹配一个或多个相邻空格,需要先开启extglob选项(这是Bash的内置功能,不算外部程序)。

具体步骤如下:

  1. 开启扩展通配符(如果没开的话):
    shopt -s extglob
    
  2. 对目标字符串执行全局替换:
    str="too   many    spaces."
    str="${str//+( )/ }"
    echo "$str"  # 输出:too many spaces.
    

语法解释

  • //:表示对字符串中所有匹配的内容进行全局替换(如果只用/只会替换第一个匹配项)
  • +( ):这是extglob提供的模式,匹配一个或多个空格(正好对应你要替换的“多个相邻空格”场景)
  • / :表示把匹配到的内容替换成单个空格

避免永久开启extglob的小技巧

如果你不想在当前shell会话中一直开启extglob,可以用子shell来执行,这样不会影响外部环境:

str="too   many    spaces."
# 子shell内开启extglob并完成替换
clean_str=$(shopt -s extglob; echo "${str//+( )/ }")
echo "$clean_str"

为什么你之前的写法没成功?

你试的"${str//*( )/.}"里,*( )是匹配零个或多个空格,这会把字符串里的“零空格”位置也替换(比如单词之间本来没有多余空格的地方),导致结果不符合预期。而+( )才是匹配一个或多个,正好对应你的需求。

另外,awk '{gsub(/[:blank:]/," ")}1'的问题是,它只是把每个空白字符(包括单个空格)都换成空格,并没有合并多个相邻的空白,所以也达不到效果。

扩展:处理所有空白字符(如制表符)

如果你的字符串里还有制表符等其他空白字符,想要统一替换成单个空格,可以把模式换成+([[:space:]]):

str="too\tmany    spaces."  # 包含制表符和多空格
shopt -s extglob
str="${str//+([[:space:]])/ }"
echo "$str"  # 输出:too many spaces.

内容的提问来源于stack exchange,提问作者Bruno Negrão Zica

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:41:04