Function 用于删除ctrl字符的Vim函数

Function 用于删除ctrl字符的Vim函数,function,vim,Function,Vim,不幸的是,我必须查看嵌入了大量控制字符的文件,例如一些网络和应用程序日志。不必费心找一个合适的查看器并想在VIM中删除它们 我开始编写一个函数,一个接一个地删除它们,目的是在十六进制或unicode字符列表正常工作后,对其进行while循环 奇怪的事情正在发生。在第一个文件中,我尝试了该函数,文件中有33000个^@和2000个^M function! CleanCtrlChar() "Remove Ctrl Chars from file eg where ^ @ is CtrlQ-

不幸的是,我必须查看嵌入了大量控制字符的文件,例如一些网络和应用程序日志。不必费心找一个合适的查看器并想在VIM中删除它们

我开始编写一个函数,一个接一个地删除它们,目的是在十六进制或unicode字符列表正常工作后,对其进行while循环

奇怪的事情正在发生。在第一个文件中,我尝试了该函数,文件中有33000个
^@
和2000个
^M

function!  CleanCtrlChar()
    "Remove Ctrl Chars from file eg where ^ @ is CtrlQ-@
    :%s/^ @//ge
    :%s/^ M//ge
endfunction
执行下面的snippet函数时,会报告在调用时删除约2300个
^@
和小于1000个
^M
,但实际上不会删除那么多。从命令行
%s/^@//ge
删除所有33000

:%s/^@//ge
更改为
:%s/^@//ge
实际上会将引用的匹配数替换为空格

编辑:

计算出,即使使用
:execute%s/^@//g
,在函数中也可以不使用任何内容替换
\%x00
,这与使用命令行时的效果不同。不知道为什么容易避免

仍然需要找出为什么该函数不能替换所有匹配项

:编辑

为什么函数报告它删除了匹配项,但删除的内容少于它报告的内容


为什么函数不删除所有匹配项?它的解析与命令行不同吗?

看起来像是vimscript错误。一个笨拙的解决方法是将它们转换为文件中找不到的字符串,然后将其转换为“”