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

如何在bash中对字符串选择性移除空格,保留英文单词间的空格

问题解答:Bash中选择性移除字符串空格的实现方法

需求说明

需要保留英文字母/英文单词之间的空格,其余所有位置(中文字符之间、中英字符之间、中文与标点之间)的空格全部删除,最终输出去重后的结果。

实现思路

  • 核心逻辑:仅保留*左右两侧均为英文字母(a-z、A-Z)*的空格,其余所有位置的空格全部删除
  • 使用GNU sed作为处理工具,属于bash环境默认预装的常用工具,无需额外安装依赖

具体命令

1. 直接处理文本文件,输出符合要求的去重结果

sed -E 's/([^a-zA-Z]) +| +([^a-zA-Z])/\1\2/g' input.txt | sort -u

2. 处理单行字符串

str="hello world 你 好 世 界!"
result=$(sed -E 's/([^a-zA-Z]) +| +([^a-zA-Z])/\1\2/g' <<< "$str")
echo "$result"

可选优化:合并英文之间的连续空格

如果需要同时把英文之间的多个连续空格合并为单个空格,可调整命令为:

sed -E 's/([^a-zA-Z]) +| +([^a-zA-Z])/\1\2/g; s/([a-zA-Z]) +([a-zA-Z])/\1 \2/g' input.txt | sort -u

命令解释

  • -E:启用扩展正则表达式,避免过多转义字符
  • s/([^a-zA-Z]) +| +([^a-zA-Z])/\1\2/g:正则替换规则
    • [^a-zA-Z]:匹配所有非英文字母的字符(包括中文字符、标点、数字等)
    • ([^a-zA-Z]) +:匹配「非英文字符 + 1个或多个空格」的组合,将非英文字符捕获为分组1
    • +([^a-zA-Z]):匹配「1个或多个空格 + 非英文字符」的组合,将非英文字符捕获为分组2
    • 替换为\1\2:只保留捕获到的非英文字符,删除中间的空格
    • g:全局替换,处理整行所有匹配的位置
  • sort -u:对处理后的结果去重,匹配示例输出要求

测试效果

对给出的示例输入执行命令后,输出结果完全匹配预期:

hello world你好世界!
你好世界hello world

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 04:45:03