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

mrt*_*181 69 vim symbols gvim find-and-replace

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

^@

它不是字符串的一部分;它不可搜索。我如何用空替换这个符号,或者我如何删除这个符号?

这是一个文件中的示例行:

^@F^@i^@l^@e^@n^@a^@m^@e^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@ ^@:^@ ^@^M^@
Run Code Online (Sandbox Code Playgroud)

小智 62

你可以试试:

  • %s/<CTRL-2>//g (在普通 PC 上)

  • %s/<CTRL-SHIFT-2>//g (在 Mac PC 上)

其中<CTRL-2>意味着首先按下CTRL普通电脑上的 ,保持按下,点击2,释放CTRL

<CTRL-SHIFT-2>表示首先按下controlMac PC 上的 ,保持按下状态,按下shiftMac PC 上的 ,保持按下状态,点击2,释放controlshift

最后,这两个命令都应该在%s/^@//g屏幕上显示。^@表示单个字符(一个 NULL 字节,否则无法显示),^后面不跟@,所以你不能在上面的命令中输入^@

此命令删除所有^@.

  • 刚刚通过相关链接偶然发现了这个问题/答案:这实际上是一个糟糕的建议,只会在极少数情况下正常工作。最好实际更改编码而不是删除空字节。如果删除空字节,您可能仍然有其他多字节字符显示为垃圾。 (5认同)

小智 52

我不认为您的文件已损坏。您的示例行看起来像包含每个字符之间带有空字节的常规文本。这表明它是一个以 UTF-16 编码的文本文件,但文件开头缺少字节顺序标记。见http://en.wikipedia.org/wiki/Byte-order_mark

假设我打开记事本,输入“文件名”这个词,然后保存为 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

  • 要删除它们,请选择另一种编码并再次保存文件::set fenc=utf-8 (7认同)

小智 41

这实际上在 vim 中对我有用:

:%s/\%x00//g
Run Code Online (Sandbox Code Playgroud)

  • 这适用于替代(),但 Ctl-VCtl-Shift-2 不。 (5认同)
  • 这适用于我的 linux。'00' 是 ASCII 十六进制值,你可以在 vim 中找到任何字符,方法是将光标放在它上面并在命令模式下输入 'ga'(想想“get ascii)或在命令行中输入 :as / :ascii。http ://vim.wikia.com/wiki/Showing_the_ASCII_value_of_the_current_character (5认同)

pav*_*ium 13

该“符号”表示 NULL 字符,ASCII 值为 000。

用vim很难删除,试试

tr -d '\000' < file1 > file2
Run Code Online (Sandbox Code Playgroud)


小智 8

正如其他人所指出的,那些是空字节(ASCII 00)。在 Linux 上,将 ASCII 值输入 vim 的方法是按 Ctrl-V 后跟任意字符的 3 位八进制值。要替换所有空字节,请使用:

    :%s/Ctrl-V000//g

(没有空格)。

同样,您可以使用以下命令搜索空值:

    /Ctrl-V000

在这两种情况下,它不会在您键入零时显示零,但在输入所有三个后,它会显示^@. 在彩色终端上,它将显示为蓝色,表示它是一个控制字符。


rpy*_*yzh 6

FWIW,就我而言,我必须在 cygwin 上使用 vim 来编辑在 mac 上创建的文本文件。接受的解决方案对我不起作用,但很接近。根据Vim wiki page about working with Unicode,BOM 字节的 Big Endian 和 Little Endian 版本之间存在差异。所以,我必须明确告诉vim使用 BOM 编码的 Little Endian 版本。

只有在选择正确的编码后,我才将文件格式(行尾)转换为dos这样我可以在 Windows 编辑器中编辑文件。在指定编码之前尝试设置重置文件格式让我感到悲伤。这是我使用的命令的完整列表:

:e ++enc=utf16le
:w!
:e ++ff=mac
:setlocal ff=dos
:wq
Run Code Online (Sandbox Code Playgroud)