如何用 vim 删除这个符号“^@”?

如何用 vim 删除这个符号“^@”?

我有一些文件被这个符号损坏了:

^@

它不是字符串的一部分;无法搜索。如何用空字符替换此符号,或者如何删除此符号?

以下是某个文件中的示例行:

^@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

在这两种情况下,当你输入零时它都不会显示它们,但输入所有三个后,它将显示^@。在彩色终端上,它将以蓝色显示以指示它是一个控制字符。

相关内容