如何为" xxd -r"制作有效输入;在vim中删除一个字节?

时间:2014-11-23 07:53:56

标签: vim xxd

创建一个名为test的文件,其中包含以下内容:

0123456789abcdef0123456789abcdef

我想使用xxd删除第一个0。使用vim -b test打开它,然后在vim中运行:%!xxd。结果是:

0000000: 3031 3233 3435 3637 3839 6162 6364 6566  0123456789abcdef
0000010: 3031 3233 3435 3637 3839 6162 6364 6566  0123456789abcdef
0000020: 0a                                       .      

然后我删除了第一个30

的十六进制代码0
0000000: 31 3233 3435 3637 3839 6162 6364 6566  0123456789abcdef
0000010: 3031 3233 3435 3637 3839 6162 6364 6566  0123456789abcdef
0000020: 0a                                       .

然后我运行:%!xxd -r来读回十六进制。结果是:

^@23456789abcdef^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@

结果是乱码。我知道原因是上面的内容不是有效的xxd输入。如果我删除行号和文本部分:

31 3233 3435 3637 3839 6162 6364 6566
3031 3233 3435 3637 3839 6162 6364 6566  
0a  

我运行:%!xxd -r -p来读取十六进制。结果是正确的:

123456789abcdef0123456789abcdef

使用vim和xxd有没有更好的方法来完成这项工作?更好的方法意味着减少编辑以为xxd -r创建有效输入。

1 个答案:

答案 0 :(得分:4)

您自己发现删除字节偏移列和文本列允许您使用:%!xxd -r -p来获取所需内容。那么如何创建自定义命令来删除这些列然后进行转换呢?无论如何,:%!xxd -r -p无法输入。

类似的东西:

:command MyXXDR %s#^[^:]*: \(\%(\x\+ \)\+\) .*#\1# | %!xxd -r -p

如果您使用编辑过多地搞乱了文件的格式(例如,如果替换命令不匹配以删除必要的文本),这个确切的命令可能会导致问题,但是您明白了。