bash passando sed backreference al comando base64




unix (2)

Perl s/// può fare quello che vuoi, ma non penso che quello che chiedi sia quello di cui hai bisogno.

$ echo SGVsbG8gQmFzZTY0Cg== | perl -MMIME::Base64 -pe 's/(.+)/decode_base64($1)/e'
Hello Base64

Cosa sta realmente accadendo:

echo SGVsbG8gQmFzZTY0Cg== | sed -r "s/(.+)$/$(decodeBaseSixtyFour \\1)/"
  • Prima che sed inizi a leggere l'input, la shell rileva la sostituzione del processo nella stringa doppia citata
  • la funzione decodeBaseSixtyFour viene chiamata con la stringa "\\1"
  • base64 induce l'input \1 ed emette il messaggio di errore
  • la funzione restituisce la stringa "\1 is decoded to "
  • ora lo script sed è 's/(.+)$/\1 is decoded to /' che è il modo in cui ottieni l'ultima riga.

Quello che sto cercando di ottenere è passare il valore codificato Base64 catturato nella regex di sed sulla base64 e farlo decodificare.

Ma il problema è che, anche se sembra che il valore corretto sia passato alla funzione usando backreference, base64 lamenta che l'input non è valido.

Di seguito è il mio script -

#!/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)/"

E quando viene eseguito produce il seguente output:

Passing direct value ...
SGVsbG8gQmFzZTY0Cg== is decoded to Hello Base64
Passing captured value ...
base64: invalid input
SGVsbG8gQmFzZTY0Cg== is decoded to

Penso che l'output spieghi cosa intendo.

È possibile fare ciò che sto cercando di fare? Se no, perché?


Come ho commentato sed non si può fare un equivalente di replace_callback che è replace_callback quello che stai cercando di fare.

Il seguito di awk si avvicina a quello che stai cercando di fare:

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




backreference