我有一个严重损坏的 Sqlite 文件将所有内容转储到 sql 文件并将其加载到新文件中的常用技巧不起作用,但是使用十六进制编辑器我可以看到我需要恢复的数据在那里
我遇到了这种模式
vim 可以只显示 ASCII 字符,而将其他字节视为二进制数据吗?
vi 将不可打印的字符显示为十六进制
这很棒,会告诉我
‹14›‹07› Testy McTesterson 先生 [email protected]
但是有没有在显示时将其写入文件?
因此,将 vi 在其缓冲区中显示为 ‹14› 的十六进制值实际更改为文本文件中的那些字符
我可以在 vi 中做一个正则表达式搜索替换来做,但是我必须一次为每个不可打印的字符做一个,这是一个非常大的文件
稍后,我计划将‹14›‹07›处理成它应该表示的16位整数,但首先我需要能够将这些作为真实字符放入文本文件中
提前谢谢了
您可能会查看
xxd
附带的哪些vim
数据,并以十六进制格式转储数据,并在列中转储可打印字符。如果您编辑十六进制,您可以将数据推回xxd -r
以将其转换回二进制。然而,看看你的最终目标,你可能需要更强大的东西
perl
,比如我不是专家,但你可能会发现以下有用的东西:它将标准输入中的所有数据读入变量
$data
,然后对s/.../.../g
由任意 2 个字节后跟一个字母字符(范围 az 和 AZ)、后跟 10 个或更多可打印字符(在范围空间到波浪号,并假设 C 语言环境)。这些部分通过 using 被捕获()
为 3 个单独的部分,并由 function 的调用替换fn
。这就是e
最后的意思。该函数只返回一个字符串打印,将 2 个字节转换为整数,并与第三个未更改的参数连接。
为了提供帮助,这里有一个更简单的版本,它只做你想要的,将非打印字符替换为
<..>
.这里的模式更简单,即不可打印字符(和换行符)的范围,
^
意思是not。在查看一个简单的 sqlite 文件时,我发现文本数据之前的字符通常是可打印字符。这就是为什么我使用了一个测试字母起始字符的模式,但您可能需要使用更好的启发式方法。以下将替换 0x00 - 0x20 范围内的非打印字符(不包括 CR、LF、制表符和空格),
#xDD#
其中DD
字符的十六进制表示形式(感谢这个问题很好地定义了范围):我
seq
用来生成替换的字符范围,并awk
生成模式sed
- 后者进行实际替换。你可以用这个来测试它:
FWIW 对于人们在搜索条件下找到这个的人,在我想处理我自己的损坏文件的高山 docker 图像中,
sed
不喜欢 NULL 字符,所以我不得不像这样解决它: