我要求删除在文件列表中显示为“^ @”的所有控制字符。
在VI编辑器模式下键入控制字符^ @我们需要按CTRL + V + @ 但是在shell提示符下也是如此。 请帮帮我。
注意:我在Debian linux机器上试过。
答案 0 :(得分:3)
你在Vim看到的是" null"字节,即数字值为零的字节。
您可以将光标放在^@
的顶部并输入ga
来检查。这将显示光标下字符的数值。
如果您需要从文件中删除该字符的所有匹配项,则可以使用sed
,并且根本不需要输入^@
,因为{{1 (至少GNU版本,而不是它看起来的BSD ......)支持十六进制值的不同表示法:
sed
那会将sed "s/\x00//g" file.txt
的内容打印到stdout,删除所有零字节。如果要在原地删除字节(小心,对orignial文件有危险,还有(1)!),请使用file.txt
选项:
-i
(1)在问题sed -i "s/\x00//g" file.txt
上检查the answer by gniourf_gniourf(和评论):您将丢失文件创建日期,并且您需要确定它真的是文件你正在处理,而不是符号链接。
为了完整性,您当然可以删除零字节而不用离开Vim。
sed
:%s/<ctrl-v>x00//g
命令模式:
范围:完整档案%
搜索s/
verbatim <ctrl-v>
十六进制x
零00
替换为... /
......没什么/
(每行多次)所有这一切当然是假设您没有查看UTF-16文件而只是被那里的零字节搞糊涂了。如果是这样的话,@ IgnacioVazquez-Abrams暗示iconv当然是更好的方式:g
。但是,Vim不应该首先向你展示iconv -f UTF-16 -t UTF-8 file.txt
。
答案 1 :(得分:2)
^@
是空字节(0x00
)。要从文件中删除它,您可能希望使用真正的编辑器而不是创建临时文件的程序,然后mv
将该临时文件设置为原始文件:您将丢失所有权限,所有权和符号链接
以下是使用标准编辑器ed
从文件中删除所有空字节的方法:
ed -s file < <(printf ',s/\0//g\nw\nq\n')
如果你想使用它,例如find
,你必须这样做:
find ... -exec bash -c 'for f do ed -s "$f" < <(printf ',s/\0//g\nw\nq\n'); done' bash {} +
答案 2 :(得分:1)
注意:对于就地编辑解决方案,请参阅gniourf_gniourf's ed
-based answer(最健壮的)或DevSolar's GNU sed
-based answer。
功能
^@
用于表示NUL
和0x
输出中的vi
(cat -v
)个字节。
如果您需要从文件中删除实际 NUL
字符,则无需输入^@
; 改为使用tr -d '\0'
:
# Create sample file with embedded NUL chars.
echo 'before NUL' > file; head -c 2 </dev/zero >> file; echo 'after NUL' >>file
使用cat -v
检查文件向我们展示(请注意代表^@
字符的NUL
; $
表示换行符):
$ cat -v file
before NUL
^@^@after NUL
tr -d '\0' < file
会打印file
所有NUL
个字符的内容。删除:
$ tr -d '\0' < file | cat -v
before NUL$
after NUL$