如何将base64编码的内容传递给sed?

How to pass base64 encoded content to sed?

变量 XFILEBASE64 具有 base64 编码的内容,我想用该 base64 内容替换一些字符串。

果然base64里面有特殊字符,试了$'\001'作为分隔符,还是报错。有什么建议吗?

XFILEBASE64=`cat ./sample.xml | base64`
cat ./template.xml  | sed "s$'[=10=]1'<Doc>###%DOCDATA%###<\/Doc>$'[=10=]1'<Doc>${XFILEBASE64}<\/Doc>$'[=10=]1'g"
> sed: -e expression #1, char 256: unterminated `s' command

编辑:看起来问题与 sed 无关,它必须隐藏在 base64 操作中。

sample.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<a>testsdfasdfasdfasfasdfdasfdads</a>     

重现问题:

foo=`base64 ./sample.xml`
echo $foo | base64 --decode

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<base64: invalid input

Base64 只有三个特殊字符 (wikipedia) - 通常是 +/=。例如,您可以使用 @</code>、<code>&; 没有问题。

Tempo64="$( echo "${XFILEBASE64}" | sed 's/[\&*./+!]/\&/g' )"
sed "s!<Doc>###%DOCDATA%###</Doc>!<Doc>${Tempo64}</Doc>!g" ./template.xml
  • 应该工作并且posix合规

命令

sed "s$'[=10=]1'<Doc>###%DOCDATA%###<\/Doc>$'[=10=]1'<Doc>${XFILEBASE64}<\/Doc>$'[=10=]1'g"

应该写成

sed s$'[=11=]1'"<Doc>###%DOCDATA%###<\/Doc>"$'[=11=]1'"<Doc>${XFILEBASE64}<\/Doc>"$'[=11=]1'g

也就是说,$'...'在双引号里面,并不特殊

问题出在 base64 编码上,base64 的 -w 0 选项解决了问题。

cat ./sample.xml | base64 -w 0