bash - encoded - encoding b64
¿Cómo pasar contenido ecoded base64 a sed? (4)
La variable XFILEBASE64 tiene contenido codificado en base64 y deseo reemplazar algunas cadenas con ese contenido base64.
Efectivamente, base64 está lleno de caracteres especiales, y he intentado con $ ''/ 001'' como delimitador, obteniendo el mensaje de error. ¿Alguna sugerencia?
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
EDITAR: Parece que el problema no tiene nada que ver con sed, debe estar oculto en las operaciones de base64.
sample.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<a>testsdfasdfasdfasfasdfdasfdads</a>
Para reproducir el problema:
foo=`base64 ./sample.xml`
echo $foo | base64 --decode
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<base64: invalid input
Base64 tiene solo tres caracteres especiales ( wikipedia ), normalmente +
, /
y =
. Puedes usar por ejemplo @
, ,
&
o sin problema
El comando
sed "s$''/001''<Doc>###%DOCDATA%###<//Doc>$''/001''<Doc>${XFILEBASE64}<//Doc>$''/001''g"
debe escribirse como
sed s$''/001''"<Doc>###%DOCDATA%###<//Doc>"$''/001''"<Doc>${XFILEBASE64}<//Doc>"$''/001''g
Es decir, $''...''
entre comillas dobles no son especiales.
El problema estaba en la codificación base64, la opción -w 0 de base64 hizo el truco.
cat ./sample.xml | base64 -w 0
Tempo64="$( echo "${XFILEBASE64}" | sed ''s/[//&*./+!]///&/g'' )"
sed "s!<Doc>###%DOCDATA%###</Doc>!<Doc>${Tempo64}</Doc>!g" ./template.xml
- debería funcionar y posix obediente