如何使用sed命令删除两个空格之间的内容?
用sed删除两个空格之间内容的解决方案
嘿,这个需求用sed完全能搞定!不过得先掰扯清楚你说的“两个空格之间的内容”具体是哪种场景——毕竟不同的文本结构对应的正则写法不一样,我给你分两种最常见的情况来说明:
场景1:删除前后各一个空格包裹的单个无空格内容块
比如你有像 Apple Banana Cherry 这样的文本,想删掉中间的 Banana(前后各一个空格),最终得到 Apple Cherry。
用这个sed命令就能实现:
sed 's/ [^ ]* / /g'
命令解释:
s/:sed的替换命令开头[^ ]*:匹配「一个空格 + 任意数量的非空格字符 + 一个空格」的组合:把匹配到的内容替换成两个空格(保留原来的空格分隔)g:全局替换,处理文本中所有符合条件的匹配项
示例效果:
输入文本:
Red Green Blue One Two Three Four
执行命令后输出:
Red Blue One Three Four
场景2:删除两个空格之间的所有内容(包括内容里的空格)
如果你的文本是 Hello this is a test World 这种,想删掉两个空格之间的所有内容(哪怕中间有空格),最终得到 Hello World,就需要用非贪婪匹配的写法:
sed -E 's/ .*? / /g'
命令解释:
-E:启用扩展正则表达式,让语法更简洁.*?:匹配「两个空格 + 任意数量的字符(非贪婪模式,匹配到下一组两个空格就停止) + 两个空格」g:全局替换所有符合条件的部分
⚠️ 注意:这个写法依赖GNU sed(Linux系统默认的sed),如果是POSIX标准的sed(比如macOS默认的sed),不支持非贪婪的.*?,可以用这个替代写法(兼容性更好):
sed 's/ \{1,\}.*\{1,\} \{1,\}/ /g'
示例效果:
输入文本:
Hello this is a test World Start multiple words here End
执行命令后输出:
Hello World Start End
额外小提示
如果你的文本里有多个连续空格(比如3个、4个),想把它们当成“分隔符”处理,可以把正则里的固定空格换成 +(匹配一个或多个空格),比如场景1的命令可以改成:
sed -E 's/ +[^ ]* +/ /g'
内容的提问来源于stack exchange,提问作者icy3
相关产品推荐
相关产品推荐

