我有一些文件被这个符号损坏了:
^@
它不是字符串的一部分;无法搜索。如何用空字符替换此符号,或者如何删除此符号?
以下是某个文件中的示例行:
^@F^@i^@l^@e^@n^@a^@m^@e^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@:^@ ^@^M^@
答案1
您可以尝试:
%s/<CTRL-2>//g
(在普通电脑上)%s/<CTRL-SHIFT-2>//g
(在 Mac 电脑上)
表示<CTRL-2>
首先按下CTRL普通电脑上的 ,保持按下的状态,然后按下2,再松开CTRL。
和<CTRL-SHIFT-2>
表示首先按下control在 Mac PC 上的 ,保持按下状态,按下shift在 Mac PC 上的 ,保持按下状态,按下2,释放 ,control然后shift。
最后,这两个命令都应该在%s/^@//g
屏幕上显示。^@
表示单个字符(空字节,否则无法显示),^
后面没有@
,因此您不能在上面的命令中连续输入^
和。@
此命令将删除所有^@
。
答案2
我认为您的文件没有损坏。您的示例行看起来包含常规文本,每个字符之间都有空字节。这表明它是一个以 UTF-16 编码的文本文件,但文件开头缺少字节顺序标记。请参阅http://en.wikipedia.org/wiki/Byte-order_mark
假设我打开记事本,输入单词“filename”,然后保存为 Unicode Big-endian。该文件的十六进制转储如下所示:
fe ff 00 66 00 69 00 6c 00 65 00 6e 00 61 00 6d 00 65
如果我在 Vim 中打开此文件,它看起来不错 - “fe ff”字节告诉 Vim 文件的编码方式。现在假设我创建一个包含完全相同字节序列的文件,但没有前导“fe ff”。Vim 会插入 ^@(或 <00>,取决于您的配置)来代替空字节;记事本会插入空格。
因此,您不应该删除空值,而应该真正寻求让 Vim 正确解释文件。您可以使用以下命令让 Vim 使用正确的编码重新加载文件:
:e ++enc=utf16
答案3
这实际上在 vim 中对我有效:
:%s/\%x00//g
答案4
正如其他人所指出的,这些是空字节(ASCII 00)。在 Linux 上,将 ASCII 值输入 vim 的方法是按 Ctrl-V,然后按任意字符的 3 位八进制值。要替换所有空字节,请使用:
:%s/
Ctrl-V000//g
(没有空格)。
同样,你可以使用以下方法搜索空值:
/
Ctrl-V000
在这两种情况下,当你输入零时它都不会显示它们,但输入所有三个后,它将显示^@
。在彩色终端上,它将以蓝色显示以指示它是一个控制字符。