Comment puis-je encoder et décoder des chaînes encodées en pourcentage (encodées en URL) sur la ligne de commande?
Je recherche une solution capable de le faire:
$ percent-encode "ændrük"
%C3%A6ndr%C3%BCk
$ percent-decode "%C3%A6ndr%C3%BCk"
ændrük
Comment puis-je encoder et décoder des chaînes encodées en pourcentage (encodées en URL) sur la ligne de commande?
Je recherche une solution capable de le faire:
$ 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 les alias ;-)
Essayez la ligne de commande suivante:
$ echo "%C3%A6ndr%C3%BCk" | sed '[email protected][email protected] @g;[email protected]%@\[email protected]' | xargs -0 printf "%b"
ændrük
Vous pouvez le définir comme alias et l'ajouter à votre shell rc :
$ alias urldecode='sed "[email protected][email protected] @g;[email protected]%@\\[email protected]" | xargs -0 printf "%b"'
Ensuite, chaque fois que vous en avez besoin, il vous suffit d'aller 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 avantages ( +
) 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}"
}
Note that your urldecode() assumes the data contains no backslash.
Fonction Bash avec xxd
tool:
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 de synthèse de cdown , également à l'adresse 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])"'
Utilisation:
$ 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 sur 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
L'utilisation de sed
peut être réalisée par:
cat file | sed -e's/%\([0-9A-F][0-9A-F]\)/\\\x/g' | xargs echo -e
Essayez la anon solution:
awk -niord '{printf RT?$0chr("0x"substr(RT,2)):$0}' RS=%..
Voir: Utiliser awk printf en urldecode .
Si vous devez supprimer le codage d’URL des noms de fichiers, utilisez l’outil deurlname
de renameutils
(par exemple, deurlname *.*
).
Voir aussi:
Connexes:
jq -s -R -r @uri
-s
( --slurp
) lit les lignes d’entrée dans un tableau et -s -R
( --slurp --raw-input
) lit l’entrée 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 ''
, ceci ignorerait les sauts de ligne et les octets nuls. Sans IFS=
, cela remplacerait les caractères de IFS
par %00
. Sans LC_ALL=C
, ceci remplacerait par exemple あ
par %3042
dans les paramètres régionaux UTF-8.
Je ne peux pas commenter la meilleure réponse de ce sujet . Voici donc la mienne.
Personnellement, j'utilise ces alias pour le codage et le décodage des 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 la forme d'un argument de ligne de commande , ou de les lire à partir de entrée standard , car les deux opérateurs vérifient la présence d'arguments de ligne de commande. (même vides) et les traiter ou lire les entrées standard sinon.
... selon le commentaire de @muru.
Si vous devez également coder la barre oblique, ajoutez simplement un second argument vide à la fonction quote, la barre oblique sera également codée.
Ainsi, finalement, 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], \"\")"'
$ 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 package, renameutils
, contenant l'utilitaire deurlname
, capable de renommer un fichier contenant des caractères "codés à pourcentage".
Malheureusement, il ne décode pas stdin ni une option de ligne de commande, il ne fait que renommer un fichier. Vous devez donc créer un fichier factice pour obtenir le décodage (le nom du fichier renommé), mais avec quelques scripts de processus bash. 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.
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:]_.!~*()-]/ ? q y : q sprintf("%%%02X", z[y])
return q
}
Exemple
Lire d'autres questions sur les étiquettes command-line text url conversion encoding