【问题标题】:Use vim to search by hex code使用vim通过十六进制代码搜索
【发布时间】:2011-01-17 00:09:21
【问题描述】:

我需要清理一个文件。我们有一个在其上运行的 xml 解析器,但由于文件中的转义字符 (0x1B) 而失败。如何使用 vim 查找该字符在文件中的位置以便删除它?

示例文件:

<?php
echo "Hello, world.\n";                           
?>

转换后:

0000000: 0a3c 3f70 6870 0a65 6368 6f20 2248 656c  .<?php.echo "Hel
0000010: 6c6f 2c20 776f 726c 642e 5c6e 223b 0a3f  lo, world.\n";.?
0000020: 3e0a  

所以我删除了一个字符:(在这个例子中,'H')

0000000: 0a3c 3f70 6870 0a65 6368 6f20 22 656c  .<?php.echo "Hel
0000010: 6c6f 2c20 776f 726c 642e 5c6e 223b 0a3f  lo, world.\n";.?
0000020: 3e0a

请注意第一行的宽度不够了。当我将其转换回来时,我得到:

^@<?php
echo "el^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@> 

【问题讨论】:

    标签: search vim hex


    【解决方案1】:

    搜索(例如,使用 /\%x1b

    您还可以在命令行中输入控制字符,包括转义字符,方法是在它们前面加上 Ctrl-V。所以输入 /Ctrl-VEscEnter

    【讨论】:

    • 我不确定还需要多少细节。不要费心切换到十六进制表示。 Vim 将显示一个转义字符为^[。使用我的任何一种方法搜索它,然后将光标放在上面,使用x删除它。
    • 为了后代:nerfrubyr 的评论是关于我在要求澄清时删除的评论。原来我输入错了。这两个想法都非常适合。
    • 注意那些将 映射到“粘贴”的人(例如 Windows gvim 上的默认值):您需要将 替换为 以用控制字符做同样的事情。
    • 如果您正在寻找一个范围,请执行以下操作:/[\x7f-\xff] 您也可以通过 unicode 字符 /\u001d 查找
    • 我发现例如 /\%x1b 效果很好,但我想问一下:% 的目的/含义是什么?
    【解决方案2】:

    通过 [escape] :%!xxd 将 vim 转换为十六进制编辑器。然后搜索 0x1B (/1B)。

    【讨论】:

    • 在该模式下打开它后,如何删除该字符并保存文件?
    • 使用 h,j,k,l 导航到字符,按 'r' 并输入新字符。然后逃跑, :wq 退出并保存。
    • 我不是替换字符,而是删除它。删除后,行不匹配。从视觉十六进制转换回 ascii 时,VIM 是否处理较短的行?
    • Ups,抱歉 - 您需要在保存之前使用 ´:%!xxd -r´ 切换回 ASCII。希望这应该可以完成这项工作。
    • 这会导致文件损坏(可能是由于未对齐的行)我将编辑我的答案以显示我的意思
    【解决方案3】:

    您可以通过将光标放在字符上并按ga来发现字符的十六进制值

    您将在下面看到字符的十六进制值。 &lt;╬&gt; 字符的示例

    206, Hex ce, Oct 316, Digr I>

    删除:

    %s/\%xce//g 
    

    【讨论】:

    • 请务必注意,这将不会显示存储在文件中的物理字节,而是显示 Unicode 代码点。这不一样。例如对于德语字母Ä,它将显示Hex 00c4,它与Unicode 中的U+00C4 相关。要获取实际字节,您可以使用g8,它为您提供c3 84,这是文件中使用的Ä 的实际UTF-8 编码。
    猜你喜欢
    • 2013-11-05
    • 2014-04-08
    • 2019-01-01
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 2020-04-15
    相关资源
    最近更新 更多