【问题标题】:Replace local images with base 64用 base 64 替换本地图像
【发布时间】:2017-08-28 09:58:28
【问题描述】:

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

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

我怎样才能调整它以使它在这里工作?

【问题讨论】:

  • 你能否解释一下你的实际需求,而不是你的实际尝试和失败的原因?具有最少的输入和预期的可验证输出?

标签: regex bash shell awk


【解决方案1】:

我不知道您的文件,但恕我直言,使用 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必须格式正确,否则解析器会死。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 2020-11-27
    • 2016-05-27
    • 2013-09-20
    相关资源
    最近更新 更多