如何在shell提示符下键入^ @

时间:2015-10-26 14:38:18

标签: bash shell sh

我要求删除在文件列表中显示为“^ @”的所有控制字符。

在VI编辑器模式下键入控制字符^ @我们需要按CTRL + V + @ 但是在shell提示符下也是如此。 请帮帮我。

注意:我在Debian linux机器上试过。

3 个答案:

答案 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。 功能

^@用于表示NUL0x输出中的vicat -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$