Comment puis-je encoder et décoder des chaînes encodées en pourcentage sur la ligne de commande?

29

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
    
posée ændrük 19.07.2011 - 22:23
la source

7 réponses

33

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 ;-)

    
réponse donnée Stefano Palazzo 19.07.2011 - 23:22
la source
26

shell

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

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 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.

bash + xxd

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 .

Python

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

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 -R pour la saisie sur 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

sed

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

awk

Essayez la anon solution:

awk -niord '{printf RT?$0chr("0x"substr(RT,2)):$0}' RS=%..

Voir: Utiliser awk printf en urldecode .

décodage des noms de fichiers

Si vous devez supprimer le codage d’URL des noms de fichiers, utilisez l’outil deurlname de renameutils (par exemple, deurlname *.* ).

Voir aussi:

Connexes:

réponse donnée kenorb 14.05.2013 - 15:06
la source
8

Caractères d'URI réservés et caractères non-ASCII encodés en pourcentage

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.

Encodage en pourcentage de tous les caractères

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.

Encode en pourcentage tous les caractères sauf les caractères alphanumériques ASCII dans Bash

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.

    
réponse donnée user4669748 22.12.2015 - 03:26
la source
5

Solution pure bash pour le décodage uniquement :

$ a='%C3%A6ndr%C3%BCk'
$ echo -e "${a//%/\x}"
ændrük
    
réponse donnée loentar 09.10.2014 - 21:46
la source
4

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.

mise à jour le 16/07/2015 (1ère argument vide)

... selon le commentaire de @muru.

mise à jour le 28/05/2017 (codage par barre oblique)

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], \"\")"'

Exemple

$ 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
    
réponse donnée DIG mbl 16.07.2015 - 01:47
la source
3

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.

    
réponse donnée enzotib 19.07.2011 - 23:15
la source
0

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

    
réponse donnée Steven Penny 29.02.2016 - 02:42
la source

Lire d'autres questions sur les étiquettes