sed
Essayez la ligne de commande suivante:
$ sed 's@+@ @g;s@%@\\x@g' file | xargs -0 printf "%b"
ou l'alternative suivante en utilisant echo -e
:
$ sed -e's/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g' file | xargs echo -e
Remarque: La syntaxe ci-dessus ne peut pas être convertie +
en espaces et peut englober toutes les nouvelles lignes.
Vous pouvez le définir comme alias et l'ajouter à vos fichiers rc de shell :
$ alias urldecode='sed "s@+@ @g;s@%@\\\\x@g" | xargs -0 printf "%b"'
Ensuite, chaque fois que vous en avez besoin, il vous suffit de vous rendre avec
$ echo "http%3A%2F%2Fwww" | urldecode
http://www
Frapper
Lors de la création de scripts, vous pouvez utiliser la syntaxe suivante:
input="http%3A%2F%2Fwww"
decoded=$(printf '%b' "${input//%/\\x}")
Cependant, la syntaxe ci-dessus ne gérera pas pluses ( +
) correctement, vous devez donc les remplacer par des espaces sed
.
Vous pouvez également utiliser les fonctions urlencode()
et urldecode()
suivantes:
urlencode() {
# urlencode <string>
local length="${#1}"
for (( i = 0; i < length; i++ )); do
local c="${1:i:1}"
case $c in
[a-zA-Z0-9.~_-]) printf "$c" ;;
*) printf '%%%02X' "'$c" ;;
esac
done
}
urldecode() {
# urldecode <string>
local url_encoded="${1//+/ }"
printf '%b' "${url_encoded//%/\\x}"
}
Notez que ci-dessus urldecode()
suppose que les données ne contiennent pas de barre oblique inverse.
Voici une version similaire de Joel disponible sur: https://github.com/sixarm/urldecode.sh
bash + xxd
Fonction Bash avec xxd
outil:
urlencode() {
local length="${#1}"
for (( i = 0; i < length; i++ )); do
local c="${1:i:1}"
case $c in
[a-zA-Z0-9.~_-]) printf "$c" ;;
*) printf "$c" | xxd -p -c1 | while read x;do printf "%%%s" "$x";done
esac
done
}
Trouvé dans le fichier gist de cdown , également à stackoverflow .
PHP
En utilisant PHP, vous pouvez essayer la commande suivante:
$ echo oil+and+gas | php -r 'echo urldecode(fgets(STDIN));' // Or: php://stdin
oil and gas
ou juste:
php -r 'echo urldecode("oil+and+gas");'
Utilisez cette option -R
pour la saisie de plusieurs lignes.
Perl
En Perl, vous pouvez utiliser URI::Escape
.
decoded_url=$(perl -MURI::Escape -e 'print uri_unescape($ARGV[0])' "$encoded_url")
Ou pour traiter un fichier:
perl -i -MURI::Escape -e 'print uri_unescape($ARGV[0])' file
awk
Essayez une solution unique :
awk -niord '{printf RT?$0chr("0x"substr(RT,2)):$0}' RS=%..
Remarque: Le paramètre -n
est spécifique à GNU awk
.
Voir: Utilisation de awk printf pour urldecode text .
décodage des noms de fichiers
Si vous devez supprimer le codage d’URL des noms de fichiers, utilisez l’ deurlname
outil de renameutils
(par exemple deurlname *.*
).
Voir également:
Apparenté, relié, connexe: