sed
Wypróbuj następującą linię poleceń:
$ sed 's@+@ @g;s@%@\\x@g' file | xargs -0 printf "%b"
lub następująca alternatywa przy użyciu echo -e
:
$ sed -e's/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g' file | xargs echo -e
Uwaga: powyższa składnia może nie być konwertowana +
na spacje i może zjadać wszystkie znaki nowej linii.
Możesz zdefiniować go jako alias i dodać do plików RC powłoki :
$ alias urldecode='sed "s@+@ @g;s@%@\\\\x@g" | xargs -0 printf "%b"'
Następnie za każdym razem, gdy jej potrzebujesz, po prostu skorzystaj z:
$ echo "http%3A%2F%2Fwww" | urldecode
http://www
Grzmotnąć
Podczas pisania skryptów możesz użyć następującej składni:
input="http%3A%2F%2Fwww"
decoded=$(printf '%b' "${input//%/\\x}")
Jednak powyższa składnia nie będzie +
poprawnie obsługiwać plusów ( ), więc musisz zastąpić je spacjami przez sed
.
Możesz także użyć następujących funkcji urlencode()
i urldecode()
funkcji:
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}"
}
Zauważ, że powyżej urldecode()
zakłada się, że dane nie zawierają ukośnika odwrotnego.
Oto podobna wersja Joela znaleziona na: https://github.com/sixarm/urldecode.sh
bash + xxd
Funkcja Bash z xxd
narzędziem:
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
}
Znalezione w pliku gist cdown , również w stackoverflow .
PHP
Za pomocą PHP możesz wypróbować następujące polecenie:
$ echo oil+and+gas | php -r 'echo urldecode(fgets(STDIN));' // Or: php://stdin
oil and gas
Lub tylko:
php -r 'echo urldecode("oil+and+gas");'
Użyj -R
do wprowadzania wielu linii.
Perl
W Perlu możesz używać URI::Escape
.
decoded_url=$(perl -MURI::Escape -e 'print uri_unescape($ARGV[0])' "$encoded_url")
Lub przetworzyć plik:
perl -i -MURI::Escape -e 'print uri_unescape($ARGV[0])' file
awk
Wypróbuj rozwiązanie anonowe :
awk -niord '{printf RT?$0chr("0x"substr(RT,2)):$0}' RS=%..
Uwaga: parametr -n
jest specyficzny dla GNU awk
.
Zobacz: Używanie awk printf do kodu urldecode .
dekodowanie nazw plików
Jeśli chcesz usunąć kodowanie adresu URL z nazw plików, użyj deurlname
narzędzia z renameutils
(np deurlname *.*
.).
Zobacz też:
Związane z: