Comment puis-je encoder et décoder des chaînes encodées en pourcentage (encodées en URL) sur la ligne de commande?
Je cherche une solution qui peut faire ceci:
$ percent-encode "ændrük"
%C3%A6ndr%C3%BCk
$ percent-decode "%C3%A6ndr%C3%BCk"
ændrük
Ces commandes font ce que vous voulez:
python -c "import urllib, sys; print urllib.quote(sys.argv[1])" æ
python -c "import urllib, sys; print urllib.unquote(sys.argv[1])" %C3%A6
Si vous souhaitez coder des espaces en tant que +
, remplacez urllib.quote
par urllib.quote_plus
.
Je suppose que vous voudrez les alias ;-)
Essayez la ligne de commande suivante:
$ echo "%C3%A6ndr%C3%BCk" | sed 's@+@ @g;s@%@\\x@g' | xargs -0 printf "%b"
ændrük
Vous pouvez le définir comme alias et l'ajouter à vos fichiers Shell rc :
$ 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
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
.
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 votre urldecode () suppose que les données ne contiennent pas de barre oblique inverse.
Fonction Bash avec l'outil xxd
:
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 fichier Gist de cdown , également sur stackoverflow .
Essayez de définir les alias suivants:
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])"'
Usage:
$ urlencode "ændrük"
C%26ndrC%3Ck
$ urldecode "%C3%A6ndr%C3%BCk"
ændrük
Source: ruslanspivak
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 -R
pour la saisie de plusieurs lignes.
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
Utiliser sed
peut être obtenu en:
cat file | sed -e's/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g' | xargs echo -e
Essayez la solution anon :
awk -niord '{printf RT?$0chr("0x"substr(RT,2)):$0}' RS=%..
Voir: tilisation de awk printf pour urldecode text .
Si vous devez supprimer le codage d’URL des noms de fichiers, utilisez l’outil deurlname
de renameutils
(par exemple, deurlname *.*
).
Voir également:
En relation:
jq -s -R -r @uri
-s
(--Slurp
) lit les lignes d'entrée dans un tableau et -s -R
(--Slurp --raw-input
) lit les entrées dans une chaîne unique. -r
(--raw-output
) renvoie le contenu des chaînes au lieu des littéraux JSON.
xxd -p|tr -d \\n|sed 's/../%&/g'
tr -d \\n
supprime les sauts de ligne ajoutés par xxd -p
tous les 60 caractères.
eu () {
local LC_ALL=C c
while IFS= read -r -n1 -d '' c
do
if [[ $c = [[:alnum:]] ]]
then
printf %s "$c"
else
printf %%%02x "'$c"
fi
done
}
Sans -d ''
, cela éviterait les sauts de ligne et les octets nuls. Sans IFS=
, les caractères de IFS
seraient remplacés par %00
. Sans LC_ALL=C
, ceci remplacerait par exemple あ
par %3042
dans les paramètres régionaux UTF-8.
Solution pure bash pour le décodage uniquement:
$ a='%C3%A6ndr%C3%BCk'
$ echo -e "${a//%/\\x}"
ændrük
Je ne peux pas commenter sur meilleure réponse dans ce fil , alors voici le mien.
Personnellement, j'utilise ces alias pour le codage et le décodage d'URL:
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, transmises sous forme d'argument de ligne de commande ou de les lire à partir de entrée standard , car les deux opérateurs vérifient s’il existe des arguments en ligne de commande (même vides) et les traitent ou lisent simplement les entrées standard.
... selon le commentaire de @muru.
Si vous devez également encoder la barre oblique, ajoutez simplement un deuxième argument vide à la fonction quote, la barre oblique sera également codée.
Donc, finalement, urlencode
alias in 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], \"\")"'
$ 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
J'ai trouvé un paquetage, renameutils
, qui contient l'utilitaire deurlname
qui permet de renommer un fichier contenant des caractères "codés au pourcentage".
Malheureusement, il ne décode pas stdin ou une option de ligne de commande, mais seulement renommer un fichier. Vous devez donc créer un fichier factice pour obtenir le décodage (le nom du fichier renommé). Toutefois, le processus peut être automatisé. .
Aucune information sur la partie encodage, même parce que les caractères à encoder sont discutables. Seulement non-ASCII?
Je pense qu'il devrait y avoir un meilleur outil/méthode.
Similaire à Stefano ansqer mais en Python 3:
python -c "import urllib.parse, sys; print(urllib.parse.quote(sys.argv[1]))" æ
python -c "import urllib.parse, sys; print(urllib.parse.unquote(sys.argv[1]))" %C3%A6
Pour encoder aussi des slash:
python -c "import urllib.parse, sys; print(urllib.parse.quote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1], \"\"))"
Plus d'infos sur la différence ici .
Voici une fonction POSIX Awk pour l'encodage:
function encodeURIComponent(str, j, q) {
while (y++ < 125) z[sprintf("%c", y)] = y
while (y = substr(str, ++j, 1))
q = y ~ /[[:alnum:]_.!~*\47()-]/ ? q y : q sprintf("%%%02X", z[y])
return q
}