Je souhaite décoder lencodage dURL, existe-t-il un outil intégré pour le faire ou quelquun pourrait-il me fournir un sed
code qui fera cela?
Jai cherché un peu dans unix.stackexchange.com et sur Internet mais je nai pas trouvé doutil de ligne de commande pour le décodage encodage url.
Ce que je veux faire, cest simplement sur place éditer un fichier txt
afin que:
-
%21
devient!
-
%23
devient#
-
%24
devient$
-
%26
devient&
-
%27
devient"
-
%28
devient(
-
%29
devient)
Et ainsi de suite.
Commentaires
- stackoverflow.com/questions/6250698/…
Réponse
Jai trouvé ces doublures Python one qui font ce que vous voulez:
Python2
$ alias urldecode="python -c "import sys, urllib as ul; \ print ul.unquote_plus(sys.argv[1])"" $ alias urlencode="python -c "import sys, urllib as ul; \ print ul.quote_plus(sys.argv[1])""
Python3
$ alias urldecode="python3 -c "import sys, urllib.parse as ul; \ print(ul.unquote_plus(sys.argv[1]))"" $ alias urlencode="python3 -c "import sys, urllib.parse as ul; \ print (ul.quote_plus(sys.argv[1]))""
Exemple
$ urldecode "q+werty%3D%2F%3B" q werty=/; $ urlencode "q werty=/;" q+werty%3D%2F%3B
Références
Commentaires
- Je le sais très tard , mais y a-t-il un moyen de le faire avec lédition sur place?
- @DisplayName – me semble être un nouveau Q. Je ‘ pose la question et je fais référence à celui-ci.
- streaming:
cat your_lovely_file.csv| python -c "import sys, urllib as ul; [sys.stdout.write(ul.quote_plus(l)) for l in sys.stdin]"
- Voir la réponse de @DIG mbl ‘ ci-dessous pour une réponse qui fonctionne avec stdin.
Réponse
sed
Essayez la ligne de commande suivante:
$ sed "s@+@ @g;s@%@\\x@g" file | xargs -0 printf "%b"
ou lalternative 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 peut ne pas convertir +
aux espaces, et peut manger toutes les nouvelles lignes.
Vous pouvez le définir comme alias et lajouter à vos fichiers shell rc :
$ alias urldecode="sed "s@+@ @g;s@%@\\\\x@g" | xargs -0 printf "%b""
Ensuite, chaque fois que vous en avez besoin, utilisez simplement:
$ echo "http%3A%2F%2Fwww" | urldecode http://www
Bash
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 les plus (+
) correctement, vous devez donc les remplacer par des espaces via sed
ou comme suggéré par @isaac , utilisez la syntaxe suivante:
decoded=$(input=${input//+/ }; printf "${input//%/\\x}")
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 la version similaire de Joel trouvée à: 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 simplement:
php -r "echo urldecode("oil+and+gas");"
Utilisez -R
pour une entrée sur plusieurs lignes.
Perl
En Perl vous peut 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 anon solution:
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 code urldecode .
décodage des noms de fichiers
Si vous devez supprimer le codage URL des noms de fichiers, utilisez loutil deurlname
de renameutils
(par exemple deurlname *.*
).
Voir aussi:
- Peut wget décoder lURI noms de fichiers lors du téléchargement par lots?
- Comment supprimer le codage URI des noms de fichiers?
En relation:
- Comment décoder une chaîne encodée en URL dans le shell? à SO
- Comment puis-je encoder et décoder des chaînes codées en pourcentage sur la ligne de commande? sur Ask Ubuntu
Commentaires
-
awk
: Comme cela fait utilisation dune fonction de bibliothèque,chr()
, il y a une forte probabilité quelle fonctionnera uniquement sur GNU awk (gawk
). Cependant, dans ce cas, il ny aura pratiquement pas déquivalent pour POSIXawk
, car loption-n
(autorisant les arguments non décimaux) EST une spécialité GNUawk
. - Vos solutions impliquant
printf
ne prennent pas en compte que lURL peut contenir des signes de pourcentage échappés comme%25
. Vous les transmettez à printf sans les échapper pour printf avec un autre signe de pourcentage comme%%
. - La version bash nécessite
local LC_ALL=C
en haut, sinon tous les caractères larges (cest-à-dire japonais, chinois, etc.) ne sont pas correctement décomposés en octets. - github.com/SixArm/ urlencode.sh
- Les versions printf ne fonctionnent pas ‘ avec la version BSD de printf (par exemple macOS), mais cela fonctionne bien avec le Version de GNU Coreutils.
Réponse
Il existe une fonction intégrée pour cela dans la bibliothèque standard Python. Dans Python 2, il « s urllib.unquote
.
decoded_url=$(python2 -c "import sys, urllib; print urllib.unquote(sys.argv[1])" "$encoded_url")
Ou pour traiter un fichier:
python2 -c "import sys, urllib; print urllib.unquote(sys.stdin.read())" <file >file.new && mv -f file.new file
Dans Python 3, cest « s urllib.parse.unquote
.
decoded_url=$(python3 -c "import sys, urllib.parse; print(urllib.parse.unquote(sys.argv[1]))" "$encoded_url")
Ou pour traiter un fichier:
python3 -c "import sys, urllib; print(urllib.parse.unquote(sys.stdin.read()))" <file >file.new && mv -f file.new file
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
Si vous voulez vous en tenir aux outils portables POSIX, cest » Cest gênant, car le seul candidat sérieux est awk, qui nanalyse pas les nombres hexadécimaux. Voir Utilisation de awk printf pour code urldecode pour des exemples dimplémentations awk courantes, y compris BusyBox.
Réponse
Perl one liner:
$ perl -pe "s/\%(\w\w)/chr hex $1/ge"
Exemple:
$ echo "%21%22" | perl -pe "s/\%(\w\w)/chr hex $1/ge" !"
Commentaires
- Cette réponse est intéressante lorsque vous ‘ ne voulez pas vous occuper de linstallation de modules Perl.
- Un seul qui a fonctionné avec élégance pour moi sur MacOS.
- Si vous souhaitez résoudre tous les niveaux dencodage dURL en même temps, ‘ s aussi
perl -pe 's/\%([[:xdigit:]]{2})/chr hex $1/ge while (/\%[[:xdigit:]]{2}/);'
qui décodera tous les%25xx
encodages imbriqués
Réponse
Si vous souhaitez utiliser une commande sed
simple desprit, utilisez la commande suivante:
sed -e "s/%21/!/g" -e "s/%23/#/g" -e "s/%24/$/g" -e "s/%26/\&/g" -e "s/%27/"/g" -e "s/%28/(/g" -e "s/%29/)/g"
Mais il est plus pratique de créer un script comme (disons sedscript
):
s/%21/!/g s/%23/#/g s/%24/$/g s/%26/\&/g s/%27/"/g s/%28/(/g s/%29/)/g
Puis exécutez sed -f sedscript < old > new
, qui affichera comme vous le souhaitez.
Pour plus de facilité, la commande urlencode
est également disponible directement dans gridsite-clients
peut être installé à partir de (par sudo apt-get install gridsite-clients
dans le système Ubuntu / Debian).
NAME
urlencode – convertir des chaînes vers ou depuis une forme encodée en URL
SYNOPSIS
urlencode [-m|-d] string [string ...]
DESCRIPTION
urlencode
encode les chaînes conformément à la RFC 1738.Autrement dit, les caractères
A
–Z
a
–z
0
–9
.
_
et-
sont transmis sans modification, mais tous les autres caractères sont représentés par% HH, où HH est leur deux-d Représentation ASCII hexadécimale en majuscules igit. Par exemple, lURLhttp://www.gridpp.ac.uk/
devienthttp%3A%2F%2Fwww.gridpp.ac.uk%2F
urlencode
convertit chaque caractère dans toutes les chaînes données sur la ligne de commande. Si plusieurs chaînes sont données, elles sont concaténées avec des espaces de séparation avant la conversion.OPTIONS
-m
Au lieu dune conversion complète, effectuez un « encodage dURL léger » GridSite dans lequel AZ az 0-9. = – _ @ et / sont passés sans modification. Il en résulte des chaînes légèrement plus lisibles par lhomme, mais lapplication doit être prête à créer ou simuler les répertoires impliqués par les barres obliques.
-d
Décodez plutôt les URL que lencodage, selon RFC 1738. Les chaînes% HH et% hh sont converties et les autres caractères sont passés sans modification, à lexception que
+
est converti en espace.
Exemple dURL de décodage:
$ urlencode -d "http%3a%2f%2funix.stackexchange.com%2f" http://unix.stackexchange.com/ $ urlencode -d "Example: %21, %22, . . . , %29 etc" Example: !, ", . . . , ) etc
Commentaires
- Pour un tutoriel sur
sed
visite - Cest une mauvaise solution, car elle nécessite un codage en dur de chaque caractère. Ce problème est illustré par le code qui manque la séquence déchappement
%20
souvent utilisée. - @Overv I ‘ Révisé
- Vous pouvez également vérifier ce que fait
s/%26/&/g
. (Je lai corrigé.)
Réponse
Je ne peux « pas commenter meilleure réponse dans ce fil , alors voici la mienne.
Personnellement, jutilise ces alias pour lencodage et le décodage dURL:
alias urlencode="python -c "import urllib, sys; print urllib.quote( sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1])"" alias urldecode="python -c "import urllib, sys; print urllib.unquote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1])""
Les deux commandes vous permettent de convertir des données, passées en argument de ligne de commande ou de les lire depuis entrée standard , car les deux one-liners vérifient sil existe des arguments de ligne de commande (même vides) et les traitent ou lisent simplement entrée standard sinon.
mise à jour 2017-05-23 (encodage slash)
En réponse au commentaire de @Bevor.
Si vous doivent également encoder la barre oblique, ajoutez simplement un deuxième argument vide à la fonction de citation, puis la barre oblique sera également encodée.
Donc, enfin urlencode
alias dans bash ressemble à ceci:
alias urlencode="python -c "import urllib, sys; print urllib.quote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1], \"\")""
Examen ple
$ urlencode "Проба пера/Pen test" %D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test $ echo "Проба пера/Pen test" | urlencode %D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test $ urldecode %D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test Проба пера/Pen test $ echo "%D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test" | urldecode Проба пера/Pen test $ urlencode "Проба пера/Pen test" | urldecode Проба пера/Pen test $ echo "Проба пера/Pen test" | urlencode | urldecode Проба пера/Pen test
Commentaires
- Nencode pas les barres obliques.
- @Bevor : Exemple?
- Ajouter une barre oblique au code url » Проба пера » – > résultat: la barre oblique nest pas encodée.
- @Bevor: Vous avez raison. Merci pour votre commentaire. Je changerai également ma réponse pour y refléter votre commentaire.
Réponse
GNU Awk
#!/usr/bin/awk -fn @include "ord" BEGIN { RS = "%.." } { printf "%s", $0 if (RT != "") { printf "%s", chr("0x" substr(RT, 2)) } }
Réponse
Et une autre approche Perl:
#!/usr/bin/env perl use URI::Encode; my $uri = URI::Encode->new( { encode_reserved => 0 } ); while (<>) { print $uri->decode($_) }
Vous devrez installer le module URI::Encode
. Sur mon Debian, je pourrais simplement exécuter
sudo apt-get install liburi-encode-perl
Ensuite, jai exécuté le script ci-dessus sur un fichier de test contenant:
http://foo%21asd%23asd%24%26asd%27asd%28asd%29
Le résultat était (javais enregistré le script sous foo.pl
):
$ ./foo.pl http://foo!asd#asd$&asd"asd(asd)
Réponse
Une réponse dans le shell (principalement Posix):
$ input="%21%22" $ printf "`printf "%s\n" "$input" | sed -e "s/+/ /g" -e "s/%\(..\)/\\\\x\1/g"`" !"
Explication:
-
-e "s/+/ /g
transforme chaque+
en espace (comme décrit dans la norme url-encode) -
-e "s/%\(..\)/\\\\x\1/g"
transformez chaque%XX
en\\xXX
. Notez que lun des\
sera supprimé en citant les règles. - Le printf interne est juste là pour passer lentrée à sed. Nous pouvons le remplacer par tout autre mécanisme
- Le printf externe interprète les
\\xXX
séquences et affiche le résultat.
Modifier:
Puisque %
doit toujours être interprété dans les URL, il est possible de simplifier cette réponse. De plus, je pense quil est plus propre dutiliser xargs
au lieu de backquotes (grâce à @josch).
$ input="%21%22+%25" $ printf "%s\n" "$input" | sed -e "s/+/ /g; s/%/\\x/g" | xargs -0 printf !" %
Malheureusement, (comme @josch la remarqué) aucune de ces solutions nest compatible avec Posix car \x
la séquence déchappement nest pas définie dans Posix.
Commentaires
- Bienvenue dans U & L. Peut-être pourriez-vous expliquer cette réponse et comment cela fonctionne. Nous préférons généralement que nos réponses soient longues avec des détails, pas seulement des extraits de code.
- Jaime beaucoup cette réponse car elle ‘ est complète, portable et ne fonctionne pas ‘ t nécessitent des programmes externes plus lourds comme perl ou python. Fonctionne bien pour moi.
- Excellente solution. Et encore plus court et plus intelligent:
... | sed 's/+/ /g;s/%\(..\)/\\\\x\1/g'
. Loption-e
peut être omise ici en fait … - @josch Vous avez raison,
printf
est un intégré dansdash
et il ne ‘ pas reconnaître\x
échapper. Vous pouvez utiliser/usr/bin/printf
au lieu deprintf
pour le faire fonctionner. Normalement, vous devriez pouvoir utilisercommand printf
, mais cela ne semble pas fonctionner comme il se doit. Il continue à utiliser intégré. - @Jezz en effet la prise en charge de léchappement
\x
ne fait pas partie de POSIX: pubs.opengroup.org / onlinepubs / 9699919799 / utilities / printf.html Au cours de mes tests, jai vu un autre problème. Vous voudrez peut-être remplacer votre..
regex par[a-zA-Z0-9][a-zA-Z0-9]
car sinon, entrez comme ‘ %% % ‘ échouera. Jai également ajoutés/%/%%/g
à la fin pour massurer déchapper aux pourcentages pour printf.
Réponse
Une autre solution utilisant ruby (la réponse python acceptée ne fonctionnait pas pour moi)
alias urldecode="ruby -e "require \"cgi\"; puts CGI.unescape(ARGV[0])"" alias urlencode="ruby -e "require \"cgi\"; puts CGI.escape(ARGV[0])""
Exemple
$ urldecode "q+werty%3D%2F%3B" q werty=/; $ urlencode "q werty=/;" q+werty%3D%2F%3B
Commentaires
- Juste utilisé pour ruby, et ces déclarations ont lair plus petites. De plus, jai changé pour ARGF.read afin que je puisse le canaliser comme je le fais avec de nombreux autres utilitaires!
Réponse
Voici une fonction BASH pour faire exactement cela:
function urldecode() { echo -ne $(echo -n "$1" | sed -E "s/%/\\\\x/g") }
Commentaires
- fonctionne comme un charme
- Si vous souhaitez convertir les caractères
+
en et ne pas générer de processus, vous pouvez utiliser ceci:: "${1//+/ }" && echo -e "${_//%/\\x}"
Réponse
Shell uniquement:
$ x="a%20%25%e3%81%82";printf "${x//\%/\\x}" a %あ
Ajoutez --
ou %b
pour éviter que les arguments commençant par un tiret soient traités comme des options.
In zsh ${x//%/a}
ajoute a
à la fin mais ${x//\%/a}
remplace %
par a
.
Réponse
Voici les éléments pertinents dun autre script (que jai juste sans vergogne volé de mon script de téléchargement youtube.com à partir dune autre réponse) Jai déjà écrit. Il utilise sed
et le shell pour créer un urldecode fonctionnel.
set \! \" \# \$ \% \& \" \( \) \* \ \+ \, \/ \: \; \= \? \@ \[ \] for c do set "$@" ""$c" "$c"; shift; done curl -s "$url" | sed "s/\\u0026/\&/g;""$( printf "s/%%%X/\\%s/g;" "$@" )"
Je ne jurerais pas que cest complet – et en fait jen doute – mais il a bien géré YouTube.
Réponse
La solution simple pour chaînes courtes (le shell est lentwww):
$ str="q+werty%3D%2F%3B" $ a=${str//+/ };printf "$(echo "${a//%/\\x}")\n" q werty=/;