Eu encontrei uma maneira de fazer isso:
sed -r 's/(.*:)(: )([[:graph:]]+)/echo " 'echo -n '\3' |base64 -d'"/ge' "$FILE_JOINED"
E se você quiser dobrar as linhas longas, (com base em esta resposta )
sed -r 's/(.*:)(: )([[:graph:]]+)/echo " 'echo -n '\3' |base64 -d'"/ge' "$FILE_JOINED" | \
awk -v WIDTH=76 '
{
space="";
while (length>WIDTH) {
print substr($0,1,WIDTH);
space=" ";
$0=space substr($0,WIDTH+1);
}
print;
}
'
No caso de alguém precisar, aqui está o roteiro inteiro.
[Observe que o comando AWK do script deixa as linhas comentadas (linhas iniciadas com "#") que não estão incluídas na anterior] :
#!/bin/bash
FILE=$1
DIR='dirname $FILE'
pushd $DIR
WIDTH=76
FILE='basename $FILE'
FILE_JOINED="'basename $FILE .ldif'-una-linea.ldif"
FILE_DECODED="'basename $FILE .ldif'-decodificado.ldif"
echo
echo DIR: $DIR
echo FILE: $FILE
echo FILE_JOINED: $FILE_JOINED
echo FILE_DECODED: $FILE_DECODED
sed -n 'H; ${ x; s/\n//; s/\n //g; p}' "$FILE" > "$FILE_JOINED"
sed -r 's/(.*:)(: )([[:graph:]]+)/echo " 'echo -n '\3' |base64 -d'"/ge' "$FILE_JOINED" | \
awk -v WIDTH=$WIDTH -v space=" " '
/^[^#]/ {
while (length>WIDTH) {
print substr($0,1,WIDTH);
$0=space substr($0,WIDTH+1);
}
print;
}
/^[#]|^$/ {
print;
}
' > $FILE_DECODED
rm $FILE_JOINED
ATUALIZAÇÃO 20180830
Houve um erro com a expansão do shell. Não estava preservando os caracteres "*", mas substituindo-os por uma lista de arquivos.
A correção foi adicionar aspas duplas no primeiro comando echo. Eu já consertei os comandos e scripts mostrados anteriormente.
O comando ERRONEOUS foi:
sed -r 's/(.*:)(: )([[:graph:]]+)/echo 'echo -n '\3' |base64 -d'/ge' "$FILE_JOINED"
ATUALIZAÇÃO 20180830-b
O comando AWK também estava modificando comentários, e não deveria ter feito isso.
O comando PREVIOUS foi:
awk -v WIDTH=$WIDTH '
BEGIN {
space=" ";
}
{
while (length>WIDTH) {
print substr($0,1,WIDTH);
$0=space substr($0,WIDTH+1);
}
print;
}
' > $FILE_DECODED