如何在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
相关产品推荐
相关产品推荐

