sed
Coba baris perintah berikut:
$ sed 's@+@ @g;s@%@\\x@g' file | xargs -0 printf "%b"
atau alternatif berikut menggunakan echo -e
:
$ sed -e's/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g' file | xargs echo -e
Catatan: Sintaks di atas mungkin tidak dikonversi +
ke spasi, dan dapat memakan semua baris baru.
Anda dapat mendefinisikannya sebagai alias dan menambahkannya ke file rc shell Anda :
$ alias urldecode='sed "s@+@ @g;s@%@\\\\x@g" | xargs -0 printf "%b"'
Lalu setiap kali Anda membutuhkannya, cukup ikuti:
$ echo "http%3A%2F%2Fwww" | urldecode
http://www
Pesta
Saat membuat skrip, Anda dapat menggunakan sintaks berikut:
input="http%3A%2F%2Fwww"
decoded=$(printf '%b' "${input//%/\\x}")
Namun sintaks di atas tidak akan menangani plus ( +
) dengan benar, jadi Anda harus menggantinya dengan spasi via sed
.
Anda juga dapat menggunakan fungsi urlencode()
dan berikut ini urldecode()
:
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}"
}
Perhatikan bahwa di atas urldecode()
mengasumsikan data tidak mengandung garis miring terbalik.
Berikut ini adalah versi Joel serupa yang ditemukan di: https://github.com/sixarm/urldecode.sh
bash + xxd
Fungsi Bash dengan xxd
alat:
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
}
Ditemukan di file inti cdown , juga di stackoverflow .
PHP
Menggunakan PHP Anda dapat mencoba perintah berikut:
$ echo oil+and+gas | php -r 'echo urldecode(fgets(STDIN));' // Or: php://stdin
oil and gas
atau hanya:
php -r 'echo urldecode("oil+and+gas");'
Gunakan -R
untuk input baris ganda.
Perl
Di Perl Anda dapat menggunakan URI::Escape
.
decoded_url=$(perl -MURI::Escape -e 'print uri_unescape($ARGV[0])' "$encoded_url")
Atau untuk memproses file:
perl -i -MURI::Escape -e 'print uri_unescape($ARGV[0])' file
awk
Coba solusi anon :
awk -niord '{printf RT?$0chr("0x"substr(RT,2)):$0}' RS=%..
Catatan: Parameter -n
khusus untuk GNU awk
.
Lihat: Menggunakan awk printf untuk urldecode teks .
nama file decoding
Jika Anda perlu menghapus penyandian url dari nama file, gunakan deurlname
alat dari renameutils
(mis deurlname *.*
.).
Lihat juga:
Terkait: