我正在构建一些电子邮件模板,其中包含一些本地图片。
我正在尝试编写一个shell脚本来替换将我的图像转换为base64。所以基本上自动转:
<img width="100%" src="./img/my_image.gif" />
到
<img width="100%" src="data:image/gif;base64,XXXXXXX" />
现在我使用了这个脚本:
#!/bin/bash
awk -F'[()]' -v q="'" '
/src="(.*)"/ {
cmd=sprintf("openssl enc -base64 -in %s | tr -d %c\\n%c",$2,q,q)
cmd | getline b64
close(cmd)
$0=$1 "(data:image/gif;base64," b64 ");"
}1' ./my_template.html
我遇到两个问题: - 即使它在regex101上工作正常,我的正则表达式似乎也不正确 - 这个正则表达式也会捕获非本地的图像(src =&#34; https://....")
我如何调整它以使其在此工作?
答案 0 :(得分:0)
尝试:
awk '/^<img/{w=$3;gsub(/.*\/|\"/,"",w);split(w, array,".");sub(/src=\".*\"/,"src=\"data:" array[1] "/"array[2]";base64,XXXXXXX\"",$3);print}' Input_file
虽然我同意Inian一样,你的问题中有很多问题,如果这对你没有帮助,请在你的帖子中提及所有条件和预期输出。
答案 1 :(得分:0)
我不知道你的文件,但恕我直言使用awk编辑html并不是最好的主意。在一般情况下,我会使用更好的工具,如perl
等。
以下是使用xmlstarlet
的示例。以下脚本:
#!/bin/bash
htmlfile=t.html
encode_image() {
local img="$1"
ext="${img##*.}"
printf "data:image/%s;base64,%s" "$ext" $(openssl base64 -A -in "$img")
}
while read -r src; do
encoded=$(encode_image "$src")
xmlstarlet ed --inplace -u "//img[@src='$src']/@src" -v "$encoded" t.html
done < <(xmlstarlet sel -t -v '//img/@src' -n "$htmlfile")
来自此t.html
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8"/>
</head>
<body>
<p>bla</p>
<img width="100%" src="./img/my_image.gif" />
<p>otherbla</p>
<img width="100%" src="./img/my_image2.gif" />
</body>
</html>
创建:
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8"/>
</head>
<body>
<p>bla</p>
<img width="100%" src="data:image/gif;base64,iVB....="/>
<p>otherbla</p>
<img width="100%" src="data:image/gif;base64,iVBO...="/>
</body>
</html>
当然,HTML必须正确格式化,否则解析器就会死掉。