如何用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'
命令拆解:
-E:启用扩展正则表达式,不用给括号加反斜杠转义,写起来更清爽。:loop:定义一个循环标签,用来反复处理括号内的空格,直到全部清理干净。- 替换规则
s/(\[[a-zA-Z0-9 ,]*?) ([a-zA-Z0-9 ,]*?\])/\1\2/:- 第一个捕获组
(\[[a-zA-Z0-9 ,]*?):匹配[开头,加上任意数量的字母、数字、逗号、空格(非贪婪匹配,确保只抓到空格前的内容)。 - 中间的
:就是我们要移除的目标空格。 - 第二个捕获组
([a-zA-Z0-9 ,]*?\]):匹配空格后到]的所有内容(同样非贪婪,避免跨括号匹配)。 - 替换成
\1\2:把两个捕获组拼接,相当于删掉中间的空格。
- 第一个捕获组
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
相关产品推荐
相关产品推荐

