不幸的是,我必须查看嵌入了大量控制字符的文件,例如一些网络和应用程序日志。无法找到合适的查看者并希望在VIM中删除它们。
我开始编写一个函数来逐个删除它们,目的是在它运行时将一个while循环舍入一个hex或unicode字符列表。
发生了奇怪的事情。在第一个文件中,我尝试了该函数,文件中有33000 ^@
和2000 ^M
。
function! CleanCtrlChar()
"Remove Ctrl Chars from file eg where ^ @ is CtrlQ-@
:%s/^ @//ge
:%s/^ M//ge
endfunction
执行下面的代码片段,报告在调用时删除~2300 ^@
和少于1000 ^M
,但实际上并没有删除那么多。从命令行%s/^@//ge
删除所有33000。
将:%s/^ @//ge
更改为:%s/^ @/ /ge
实际上会将引用的匹配数替换为空格。
编辑:
尽管使用\%x00
替换:execute %s/^@//g
没有任何功能在函数中的作用与命令行不同。不确定为什么容易避免。
仍然需要解决为什么函数不能替换所有匹配项。
:EDIT
为什么函数报告它删除了匹配但删除的内容少于报告?
为什么函数不会删除所有匹配项?它的解析方式与命令行不同吗?