删除字节时,如何在vim中为“ xxd -r”进行有效输入?

Jin*_*Yao 5 vim xxd

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

0123456789abcdef0123456789abcdef
Run Code Online (Sandbox Code Playgroud)

我想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                                       .      
Run Code Online (Sandbox Code Playgroud)

然后我删除的十六进制代码30为先0:

0000000: 31 3233 3435 3637 3839 6162 6364 6566  0123456789abcdef
0000010: 3031 3233 3435 3637 3839 6162 6364 6566  0123456789abcdef
0000020: 0a                                       .
Run Code Online (Sandbox Code Playgroud)

然后我:%!xxd -r跑回阅读十六进制。结果是:

^@23456789abcdef^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@
Run Code Online (Sandbox Code Playgroud)

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

31 3233 3435 3637 3839 6162 6364 6566
3031 3233 3435 3637 3839 6162 6364 6566  
0a  
Run Code Online (Sandbox Code Playgroud)

我跑去:%!xxd -r -p读回十六进制。结果是正确的:

123456789abcdef0123456789abcdef
Run Code Online (Sandbox Code Playgroud)

使用vim和xxd是否有更好的方法来完成这项工作?更好的方法意味着更少的编辑即可为进行有效的输入xxd -r。

Ben*_*Ben 4

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

就像是:

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

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