我有一个很大的(117MB!)html文件,其中有成千上万个图像编码为base64,我想将它们解码为JPG,但是我的bash-fu不足以做到这一点,而且我还没有能够在线找到答案
答案 0 :(得分:1)
通常,无法使用正则表达式正确解析HTML,但是如果您使用特定的受限格式,则可以使用它。
给出一个简单的格式,例如
<body>
<img src="data:image/jpeg;base64,DpFDPGOIg3renreGR43LGLJKds==">
<img src="data:image/jpeg;base64,DpFDPGOIg3renreGR43LGLJKds=="><img src="data:image/jpeg;base64,DpFaPGOIg3renreGR43LGLJKds==">
<div><img src="data:image/jpeg;base64,DpFdPGOIg3renreGR43LGLJKds=="></div>
</body>
以下可以提取数据
i=0; awk 'BEGIN{RS="<"} /="data:image\/jpeg;base64,[^\"]*"/ { match($0, /="data:image\/jpeg;base64,([^\"]*)"/, data); print data[1]; }' test.html | while read d; do echo $d | base64 -d > $i.jpg; i=$(($i+1)); done
要将其分解:
i=0
保留一个计数器,以便我们为每个图像输出不同的文件名。
awk 'BEGIN{RS="<"}
运行awk,并将“记录分隔符”从默认换行符更改为<,因此我们始终将每个HTML元素视为一个单独的记录。
/="data:image\/jpeg;base64,[^\"]*"/
仅对嵌入了base64 jpeg数据的记录运行以下命令。
{ match($0, /="data:image\/jpeg;base64,([^\"]*)"/, data); print data[1]; }'
拔出数据本身,将其与逗号和尾引号之间的括号匹配的部分取出,然后打印出来。
test.html
仅输入文件名。
| while read d; do
将输出的base64数据传递到循环中。 read
会将每一行放入d
,直到没有更多输入为止。
echo $d | base64 -d > img$i.jpg;
通过base64解码器传递当前图像,并将输出存储到文件中。
i=$(($i+1));
递增以更改下一个文件名。
done
完成。
有些事情可能在这里可以做得更好:
match()
函数的过程中重复正则表达式,但是我无法使其正常工作。 / li>
base64
不知道仅使用输入的一行。echo $d | base64 -d > img$((i++)).jpg
正确地将编码数据写入了多个文件,也仅将写入计数器的位置(即echo $d > img$((i++)).b64
)直接写入了第一个文件。我没有等着解决这个问题,而是将增量分成了自己的命令。答案 1 :(得分:0)
您可以尝试使用Python抓取图像的编码字符串。 然后检出this以将编码的字符串转换为图像。
答案 2 :(得分:0)