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,释放control和shift。
最后,这两个命令都应该在%s/^@//g
屏幕上显示。^@
表示单个字符(一个 NULL 字节,否则无法显示),^
后面不跟@
,所以你不能在上面的命令中输入^
和@
。
此命令删除所有^@
.
小智 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
小智 41
这实际上在 vim 中对我有用:
:%s/\%x00//g
Run Code Online (Sandbox Code Playgroud)
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
在这两种情况下,它不会在您键入零时显示零,但在输入所有三个后,它会显示^@
. 在彩色终端上,它将显示为蓝色,表示它是一个控制字符。
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)
归档时间: |
|
查看次数: |
80371 次 |
最近记录: |