用base 64替换本地图像

时间:2017-04-03 13:43:06

标签: regex bash shell awk

我正在构建一些电子邮件模板,其中包含一些本地图片。

我正在尝试编写一个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://....")

我如何调整它以使其在此工作?

2 个答案:

答案 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必须正确格式化,否则解析器就会死掉。