【问题标题】:How to pass base64 encoded content to sed?如何将base64编码的内容传递给sed?
【发布时间】:2015-08-27 14:41:53
【问题描述】:

变量 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 操作中。

示例.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

【问题讨论】:

  • 哪个操作系统和最终 LANG ? Unix 根据操作系统和 LANG 值进行不同的处理,而 sed 是纯文本(如果我没记错的话是 ASCII),因此这些字符往往被解释为 EOL。也不是每个 sed 都允许十六进制编码(八进制似乎更可用)
  • 操作系统是 RHEL 7.1 和 LANG en_US.UTF-8,我不认为十六进制是一个问题,如果我留下十六进制分隔符并用静态字符串替换变量内容就可以了。
  • 对,回复我更清楚,这不是变量或模板文件中特殊字符的问题,您只需将十六进制作为分隔符即可

标签: bash shell sed base64


【解决方案1】:

问题在于 base64 编码,base64 的 -w 0 选项可以解决问题。

cat ./sample.xml | base64 -w 0

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 试过@得到同样的问题,我认为问题出在base64的某个地方
    【解决方案3】:
    Tempo64="$( echo "${XFILEBASE64}" | sed 's/[\\&*./+!]/\\&/g' )"
    sed "s!<Doc>###%DOCDATA%###</Doc>!<Doc>${Tempo64}</Doc>!g" ./template.xml
    
    • 应该可以工作并且符合 posix 标准

    【讨论】:

    • 第二个 sed 仍然抱怨 unterminated `s'
    • 当然是 Tempo64 中的未转义字符,可以添加到第一个 sed 类中。我至少忘记了!(现在更正了)。
    • 您是否有任何失败的 XFILEBASE64“小”样本?我的 linux 上的每个测试都通过了吗?另一个限制可能是内容的大小。 XFILEBASE64 的内容是多长?
    • 当我试图重现缩小文档的问题时,注意到编码未正确完成,它引发了无效输入错误。我已经用 base64 -w 0 禁用了换行,它起作用了。非常感谢!
    • 如果需要多行,通过在 Tempo64 sed 中添加 ;$ !s/$/\\/ 转义 *new line 应该可以解决问题
    【解决方案4】:

    命令

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

    应该写成

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

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

    【讨论】:

      猜你喜欢
      • 2020-07-28
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 2012-10-27
      • 1970-01-01
      • 2014-06-08
      • 2012-08-29
      相关资源
      最近更新 更多