sed
Prova la seguente riga di comando:
$ sed 's@+@ @g;s@%@\\x@g' file | xargs -0 printf "%b"
o la seguente alternativa usando echo -e
:
$ sed -e's/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g' file | xargs echo -e
Nota: la sintassi di cui sopra potrebbe non essere convertita +
in spazi e può utilizzare tutte le nuove righe.
È possibile definirlo come alias e aggiungerlo ai file rc della shell :
$ alias urldecode='sed "s@+@ @g;s@%@\\\\x@g" | xargs -0 printf "%b"'
Quindi ogni volta che ne hai bisogno, vai semplicemente con:
$ echo "http%3A%2F%2Fwww" | urldecode
http://www
bash
Durante lo scripting, è possibile utilizzare la sintassi seguente:
input="http%3A%2F%2Fwww"
decoded=$(printf '%b' "${input//%/\\x}")
Comunque la sintassi sopra non gestirà +
correttamente i plus ( ), quindi devi sostituirli con spazi tramite sed
.
È inoltre possibile utilizzare le seguenti funzioni urlencode()
e urldecode()
funzioni:
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}"
}
Si noti che sopra urldecode()
presuppone che i dati non contengano barre rovesciate.
Ecco una versione simile di Joel disponibile su: https://github.com/sixarm/urldecode.sh
bash + xxd
Funzione Bash con xxd
strumento:
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
}
Si trova nel file gist di cdown , anche su StackOverflow .
PHP
Utilizzando PHP puoi provare il seguente comando:
$ echo oil+and+gas | php -r 'echo urldecode(fgets(STDIN));' // Or: php://stdin
oil and gas
o semplicemente:
php -r 'echo urldecode("oil+and+gas");'
Utilizzare -R
per input su più righe.
Perl
In Perl puoi usare URI::Escape
.
decoded_url=$(perl -MURI::Escape -e 'print uri_unescape($ARGV[0])' "$encoded_url")
O per elaborare un file:
perl -i -MURI::Escape -e 'print uri_unescape($ARGV[0])' file
awk
Prova una soluzione anon :
awk -niord '{printf RT?$0chr("0x"substr(RT,2)):$0}' RS=%..
Nota: il parametro -n
è specifico di GNU awk
.
Vedere: Utilizzo di awk printf per codificare il testo .
decodifica dei nomi dei file
Se è necessario rimuovere la codifica URL dai nomi dei file, utilizzare lo deurlname
strumento da renameutils
(ad es deurlname *.*
.).
Guarda anche:
Relazionato: