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

如何用sed移除方括号内字符串的空格(单行输入)

解决GNU sed只移除特定方括号内空格的问题

我明白你要解决的痛点:只想清理[a, b, c]这种格式括号里的空格,却不想碰行里其他地方的空格(比如引号里的文本)。之前的sed命令要么把整行空格都删了,要么遇到引号就出问题,确实头疼!

这里给你一个依赖最小的GNU sed方案,完美匹配你的需求:

sed -E ':loop
s/(\[[a-zA-Z0-9 ,]*?) ([a-zA-Z0-9 ,]*?\])/\1\2/
t loop'

命令拆解:

  1. -E:启用扩展正则表达式,不用给括号加反斜杠转义,写起来更清爽。
  2. :loop:定义一个循环标签,用来反复处理括号内的空格,直到全部清理干净。
  3. 替换规则s/(\[[a-zA-Z0-9 ,]*?) ([a-zA-Z0-9 ,]*?\])/\1\2/:
    • 第一个捕获组(\[[a-zA-Z0-9 ,]*?):匹配[开头,加上任意数量的字母、数字、逗号、空格(非贪婪匹配,确保只抓到空格前的内容)。
    • 中间的 :就是我们要移除的目标空格。
    • 第二个捕获组([a-zA-Z0-9 ,]*?\]):匹配空格后到]的所有内容(同样非贪婪,避免跨括号匹配)。
    • 替换成\1\2:把两个捕获组拼接,相当于删掉中间的空格。
  4. t loop:如果上一次替换成功(说明还有空格没清完),就跳回loop标签继续处理,直到括号内没有空格为止。

测试效果:

输入:

[ "This is a test": [a, b, c] ]

输出:

[ "This is a test": [a,b,c] ]

引号里的This is a test空格完全保留,只有目标方括号内的空格被移除,完美符合你的要求!

为什么之前的命令不行?

你之前用的/\[[a-zA-Z ,]\+\]/ba; :a;s/ //g问题在于:当sed匹配到整个方括号区域后,s/ //g是对整行进行全局替换,而不是只替换匹配到的区域里的空格。这个方案通过捕获组精准限定了替换范围,只动我们想要清理的空格。

内容的提问来源于stack exchange,提问作者Topper Harley

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:19:10