web-dev-qa-db-fra.com

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

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

34
Stefano Palazzo

Coquille

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

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.

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.


bash + xxd

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 .


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

Usage:

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

sed

Utiliser sed peut être obtenu en:

cat file | sed -e's/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g' | xargs echo -e

awk

Essayez la solution anon :

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

Voir: tilisation 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’outil deurlname de renameutils (par exemple, deurlname *.*).

Voir également:


En relation:

27
kenorb

Pourcentage de caractères URI réservés et de caractères non-ASCII

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.

Pourcentage d'encodage 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.

Pourcentage encoder tous les caractères sauf ASCII caractères alphanumériques 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 '', 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.

7
nisetama

Solution pure bash pour le décodage uniquement:

$ a='%C3%A6ndr%C3%BCk'
$ echo -e "${a//%/\\x}"
ændrük
5
loentar

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.

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

... selon le commentaire de @muru.

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

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

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
4
DIG mbl

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.

2
enzotib

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 .

1
Pablo Bianchi

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
}

Exemple

0
Steven Penny