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

