2017-04-03 88 views
2

我正在构建一些电子邮件模板,其中包含一些本地图片。用base 64替换本地图像

我想写一个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:// ....”)

我该如何调整它才能在此工作?

+0

你能解释一下你的实际需求,而不是你的实际尝试和失败的方式?用最少的投入和预期可核实的产出? – Inian

回答

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同意好像有很多你的问题的问题出现,如果这个不帮你,请注明所有的条件和预期输出过到您的文章。

+0

非常感谢您的帮助。基本上我试图编写一个脚本来做:“找到每个发生或src =”some/path“,如果这个路径是本地路径,则获取它指向的文件并将其转换为base64,然后替换内容与基地64编码文件的src标记“我不知道这是可行的与awk,是否有任何其他方式来做到这一点? – Spearfisher

+0

请编辑您的文章,并提供足够的输入和期望的输出,因为在这里不是很清楚。 – RavinderSingh13

0

我不知道你的文件,但恕我直言编辑HTML使用awk不是最好的主意。在一般情况下,我会使用更好的工具,如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格式必须正确,否则解析器会死。