C'est ce qui semble fonctionner pour moi.
#!/bin/bash
urldecode(){
echo -e "$(sed 's/+/ /g;s/%\(..\)/\\x\1/g;')"
}
for f in /opt/logs/*.log; do
name=${f##/*/}
cat $f | urldecode > /opt/logs/processed/$HOSTNAME.$name
done
Remplacer les "+" par des espaces et les signes "%" par des "-". \x ', et en laissant echo interpréter les \x en utilisant l'option '-e' ne fonctionnait pas. Pour une raison quelconque, la commande cat imprimait le signe % sous sa propre forme codée %25. Ainsi, sed remplaçait simplement %25 par \x25. Lorsque l'option -e était utilisée, elle évaluait simplement \x25 comme % et la sortie était la même que l'original.
Trace :
Original : Mozilla%2F5.0%20%28Macintosh%3B%20U%3B%20Intel%20Mac%20OS%20X%2010.6%3B%20en
sed : Mozilla \x252F5.0\x2520\x2528Macintosh\x253B\x2520U\x253B\x2520Intel\x2520Mac\x2520OS\x2520X\x252010.6\x253B\x2520en
echo -e : Mozilla%2F5.0%20%28Macintosh%3B%20U%3B%20Intel%20Mac%20OS%20X%2010.6%3B%20en
Fixe : En gros, ignorez les 2 caractères après le % dans sed.
sed : Mozilla \x2F5.0\x20\x28Macintosh\x3B\x20U\x3B\x20Intel\x20Mac\x20OS\x20X\x2010.6\x3B\x20en
echo -e : Mozilla/5.0 (Macintosh ; U ; Intel Mac OS X 10.6 ; en
Je ne suis pas sûr des complications que cela pourrait entraîner, après des tests approfondis, mais cela fonctionne pour l'instant.