quyến rũ
Hãy thử dòng lệnh sau:
$ sed 's@+@ @g;s@%@\\x@g' file | xargs -0 printf "%b"
hoặc thay thế sau bằng cách sử dụng echo -e
:
$ sed -e's/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g' file | xargs echo -e
Lưu ý: Cú pháp trên có thể không chuyển đổi +
thành dấu cách và có thể ăn tất cả các dòng mới.
Bạn có thể định nghĩa nó là bí danh và thêm nó vào các tệp RC shell của bạn :
$ alias urldecode='sed "s@+@ @g;s@%@\\\\x@g" | xargs -0 printf "%b"'
Sau đó, mỗi khi bạn cần, chỉ cần đi với:
$ echo "http%3A%2F%2Fwww" | urldecode
http://www
Bash
Khi viết kịch bản, bạn có thể sử dụng cú pháp sau:
input="http%3A%2F%2Fwww"
decoded=$(printf '%b' "${input//%/\\x}")
Tuy nhiên, cú pháp trên sẽ không xử lý +
chính xác dấu cộng ( ), vì vậy bạn phải thay thế chúng bằng dấu cách sed
.
Bạn cũng có thể sử dụng các chức năng urlencode()
và urldecode()
chức năng sau:
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}"
}
Lưu ý rằng ở trên urldecode()
giả định dữ liệu không chứa dấu gạch chéo ngược.
Đây là phiên bản tương tự của Joel được tìm thấy tại: https://github.com/sixarm/urldecode.sh
bash + xxd
Hàm Bash với xxd
công cụ:
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
}
Tìm thấy trong tập tin chính của cdown , cũng tại stackoverflow .
PHP
Sử dụng PHP bạn có thể thử lệnh sau:
$ echo oil+and+gas | php -r 'echo urldecode(fgets(STDIN));' // Or: php://stdin
oil and gas
hoặc chỉ:
php -r 'echo urldecode("oil+and+gas");'
Sử dụng -R
cho đầu vào nhiều dòng.
Perl
Trong Perl bạn có thể sử dụng URI::Escape
.
decoded_url=$(perl -MURI::Escape -e 'print uri_unescape($ARGV[0])' "$encoded_url")
Hoặc để xử lý tệp:
perl -i -MURI::Escape -e 'print uri_unescape($ARGV[0])' file
ôi
Hãy thử giải pháp anon :
awk -niord '{printf RT?$0chr("0x"substr(RT,2)):$0}' RS=%..
Lưu ý: Tham số -n
dành riêng cho GNU awk
.
Xem: Sử dụng awk printf để văn bản urldecode .
giải mã tên tập tin
Nếu bạn cần xóa mã hóa url khỏi tên tệp, hãy sử dụng deurlname
công cụ từ renameutils
(ví dụ deurlname *.*
).
Xem thêm:
Liên quan: