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

时间:2015-08-27 14:41:53

标签: bash shell sed base64

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

当然base64包含了特殊字符,我已经尝试了$' \ 001'作为分隔符,仍然收到错误消息。有什么建议吗?

XFILEBASE64=`cat ./sample.xml | base64`
cat ./template.xml  | sed "s$'\001'<Doc>###%DOCDATA%###<\/Doc>$'\001'<Doc>${XFILEBASE64}<\/Doc>$'\001'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

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

Base64只有三个特殊字符(wikipedia) - 通常为+/=。您可以毫无问题地使用@&;

答案 2 :(得分:2)

问题在于base64编码,base64的-w 0选项完成了这个技巧。

cat ./sample.xml | base64 -w 0

答案 3 :(得分:1)

命令

sed "s$'\001'<Doc>###%DOCDATA%###<\/Doc>$'\001'<Doc>${XFILEBASE64}<\/Doc>$'\001'g"

应该写成

sed s$'\001'"<Doc>###%DOCDATA%###<\/Doc>"$'\001'"<Doc>${XFILEBASE64}<\/Doc>"$'\001'g

也就是说,双引号中的$'...'并不特别。