变量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
答案 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
也就是说,双引号中的$'...'
并不特别。