5

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

0123456789abcdef0123456789abcdef

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

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.

4

1 回答 1

4

您自己发现,删除字节偏移列和文本列可以让您使用:%!xxd -r -p来获得所需的内容。那么如何创建一个自定义命令来删除这些列然后进行转换呢?:%!xxd -r -p无论如何,打字太多了。

就像是:

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

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

于 2014-11-24T12:31:43.973 回答