bash - google - linux base64 to binary
pasando sed retroreferencia al comando base64 (2)
Lo que intento lograr es pasar el valor codificado en Base64 capturado en la expresión regular sed
a la base64
y hacer que se descodifique.
Pero el problema es que, aunque parece que se pasa el valor correcto a la función utilizando la retro-referencia, base64
queja de que la entrada no es válida.
Lo siguiente es mi guion:
#!/bin/bash
decodeBaseSixtyFour() {
echo "$1 is decoded to `echo $1 | base64 -d`"
}
echo Passing direct value ...
echo SGVsbG8gQmFzZTY0Cg== | sed -r "s/(.+)$/$(decodeBaseSixtyFour SGVsbG8gQmFzZTY0Cg==)/"
echo Passing captured value ...
echo SGVsbG8gQmFzZTY0Cg== | sed -r "s/(.+)$/$(decodeBaseSixtyFour //1)/"
Y cuando se ejecuta, produce la siguiente salida:
Passing direct value ... SGVsbG8gQmFzZTY0Cg== is decoded to Hello Base64 Passing captured value ... base64: invalid input SGVsbG8gQmFzZTY0Cg== is decoded to
Creo que el resultado explica a qué me refiero.
¿Es posible hacer lo que estoy tratando de hacer? Si no, ¿por qué?
Perl s///
puede hacer lo que quieras, pero no creo que lo que estás pidiendo sea lo que necesitas.
$ echo SGVsbG8gQmFzZTY0Cg== | perl -MMIME::Base64 -pe ''s/(.+)/decode_base64($1)/e''
Hello Base64
Lo que está sucediendo en realidad:
echo SGVsbG8gQmFzZTY0Cg== | sed -r "s/(.+)$/$(decodeBaseSixtyFour //1)/"
- Antes de que sed comience a leer la entrada, el shell nota la sustitución del proceso en la cadena citada.
- la función
decodeBaseSixtyFour
se llama con la cadena"//1"
- base64 se bloquea en la entrada
/1
y emite el mensaje de error - la función devuelve la cadena
"/1 is decoded to "
- ahora el script sed es
''s/(.+)$//1 is decoded to /''
que es como se obtiene la última línea.
Como comenté, sed no puede hacer un equivalente de replace_callback
que es esencialmente lo que estás tratando de hacer.
Seguir awk se acerca mucho a lo que estás tratando de hacer:
s="My string is SGVsbG8gQmFzZTY0Cg== something"
awk ''{for(i=1; i<=NF; i++) if ($i~/==$/) "base64 -D<<<"$i|getline $i}1''<<<"$s"
My string is Hello Base64 something