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

ex(Vim)处理空行时自动添加额外空格如何消除

ex(静默模式Vim)空行自动追加额外空格问题

问题现象

使用ex(即运行于ex/静默模式下的Vim)做文本处理时存在异常行为:处理空行时,即使开启二进制模式,ex也会为该空行自动添加一个额外的空格字符。

复现步骤

可通过以下命令复现验证:

printf "a\n1st\n\n3rd\n.\n%%p\n" | ex -b | hexdump -C

执行上述命令得到的十六进制输出为:

00000000  31 73 74 0a 20 0a 33 72  64 0a

其中0x20就是被自动追加的多余空格。

传入指令说明

printf传入的ex指令序列逻辑:

  • a:进入文本追加模式
  • 后续追加三行文本,第二行为空行
  • .:退出追加模式
  • %p:打印全部缓冲区内容
    完整传入的指令序列如下:
a
1st

3rd
.
%p

预期结果

期望得到的正确十六进制输出为空行无额外空格,对应如下:

00000000  31 73 74 0a 0a 33 72 64  0a

原因与解决方案

根本原因

该行为不是bug,是POSIX标准中exp(print)命令的规定逻辑:打印长度为0的空行时,会自动输出一个空格再接换行,该逻辑不受-b二进制模式参数影响。

解决方法

不要使用%p命令输出缓冲区内容,改用写入命令将缓冲区内容直接输出到标准输出,即可保留原始的空行格式。
将命令中的%p替换为%w !cat,同时加上-s参数开启完全静默模式屏蔽ex的启动提示,修改后的命令如下:

printf "a\n1st\n\n3rd\n.\n%%w !cat\n" | ex -b -s | hexdump -C

执行该命令即可得到预期输出,空行位置不会被插入额外空格。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 23:54:22