技术问询:如何用sed移除三个连续句号前后空格并替换为省略号
解决sed替换三个句号为省略号时保留空格的问题
看起来你的sed命令逻辑方向是对的,但可能是空白字符匹配范围或者正则语法的小细节导致空格没被正确移除。咱们来一步步修正这个问题:
问题分析
你的原命令s/[[:space:]]*\.\.\.[[:space:]]*/…/g里,[[:space:]]会匹配所有空白字符(包括换行符、换页符等),但你实际要处理的是文本中的水平空白(空格、制表符),这时候用更精准的水平空白字符类会更可靠。另外部分老版本sed对[[:space:]]的支持可能存在兼容性问题,也会导致匹配失效。
正确的解决方案
根据你的需求,这里有几个可靠的命令选项:
1. 兼容所有sed版本的写法
直接指定匹配空格和制表符,完全避免字符类的兼容性问题:
sed 's/[ \t]*\.\.\.[ \t]*/…/g'
2. 标准水平空白字符类写法(推荐)
如果你的sed支持POSIX字符类,用[[:blank:]]匹配水平空白,语法更清晰直观:
sed 's/[[:blank:]]*\.\.\.[[:blank:]]*/…/g'
3. GNU sed简化写法
如果你用的是GNU sed(Linux系统默认版本),可以开启扩展正则,用\s快速匹配所有空白字符:
sed -E 's/\s*\.\.\.\s*/…/g'
测试验证
针对你的示例输入:
hello ... world
执行上述任意命令后,都会得到期望的输出:
hello…world
内容的提问来源于stack exchange,提问作者HenryM
相关产品推荐
相关产品推荐

