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

8

变量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

哪个操作系统和最终的语言环境?Unix 在不同的操作系统和 LANG 值下处理方式不同,sed 纯粹是文本(如果我没记错的话,是 ASCII),因此这些字符往往被解释为 EOL。并非每个 sed 都允许十六进制编码(八进制似乎更常见) 。 - NeronLeVelu
操作系统是RHEL 7.1,语言为en_US.UTF-8。如果我保留十六进制分隔符并用静态字符串替换变量内容,我认为十六进制不是问题。 - user52028778
回复:我现在更清楚地理解了,这不是变量或模板文件中特殊字符的问题,而是您将十六进制作为分隔符包含在其中。 - NeronLeVelu
5个回答

7
问题出在base64编码上,使用base64的-w 0选项解决了这个问题。
cat ./sample.xml | base64 -w 0

3

Base64只有三个特殊字符(维基百科) - 通常是+, /=。您可以使用例如@, , &;而不会出现问题。


尝试使用@解决相同的问题,我认为问题可能出现在base64中。 - user52028778

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

2
第二个 sed 仍然抱怨未终止的 `s'。 - user52028778
在Tempo64中添加第一个sed类时,一定要注意未转义的字符。我至少忘记了!(现已更正)。 - NeronLeVelu
你有没有任何“小”的 XFILEBASE64 样本失败的例子?我的 Linux 上的每个测试都通过了吗?另一个限制可能是内容的大小。XFILEBASE64 的内容长度是多少? - NeronLeVelu
如果需要多行,请使用;$ !s/$/\\/进行转义,这在Tempo64 sed中可以解决问题。 - NeronLeVelu
尝试使用Tempo64 =“ $(echo”$ {xfilebase64}“| sed's / [;$!s / $ / \ ] /] \&/ g')”未解决问题。到目前为止,我得到的唯一有效解决方案是使用base64-w 0。 - user52028778
显示剩余2条评论

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

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

1
作为对用户52028778评论的补充,我不得不阅读更多内容来诊断问题。问题在于base64命令。默认的base64命令在某些Linux发行版中每76个字符后包含换行符。这会在稍后使用变量时将一个行终止符插入到sed命令中,导致其失败。 cat ./sample.xml | base64 --wrap=0 https://linux.die.net/man/1/base64

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接