sed
ลองใช้บรรทัดคำสั่งต่อไปนี้:
$ sed 's@+@ @g;s@%@\\x@g' file | xargs -0 printf "%b"
หรือทางเลือกต่อไปนี้โดยใช้echo -e
:
$ sed -e's/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g' file | xargs echo -e
หมายเหตุ: ไวยากรณ์ข้างต้นอาจไม่แปลง+
เป็นช่องว่างและสามารถขึ้นบรรทัดใหม่ได้ทั้งหมด
คุณอาจกำหนดเป็นนามแฝงและเพิ่มลงในไฟล์shell rcของคุณ:
$ alias urldecode='sed "s@+@ @g;s@%@\\\\x@g" | xargs -0 printf "%b"'
จากนั้นทุกครั้งที่คุณต้องการเพียงแค่ไปกับ:
$ echo "http%3A%2F%2Fwww" | urldecode
http://www
ทุบตี
เมื่อสคริปต์คุณสามารถใช้ไวยากรณ์ต่อไปนี้:
input="http%3A%2F%2Fwww"
decoded=$(printf '%b' "${input//%/\\x}")
แต่เหนือไวยากรณ์จะไม่จัดการ pluses ( +
) sed
อย่างถูกต้องเพื่อให้คุณได้เพื่อแทนที่พวกเขามีช่องว่างทาง
คุณยังสามารถใช้ฟังก์ชั่นurlencode()
และ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}"
}
โปรดทราบว่าข้างต้นurldecode()
ถือว่าข้อมูลไม่มีเครื่องหมายแบ็กสแลช
นี่คือรุ่นของ Joel ที่คล้ายกันที่พบได้ที่: https://github.com/sixarm/urldecode.sh
bash + xxd
ฟังก์ชั่นทุบตีด้วย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
}
พบในไฟล์เค้า cdown ของยังที่StackOverflow
PHP
ใช้ PHP คุณสามารถลองคำสั่งต่อไปนี้:
$ echo oil+and+gas | php -r 'echo urldecode(fgets(STDIN));' // Or: php://stdin
oil and gas
หรือเพียงแค่:
php -r 'echo urldecode("oil+and+gas");'
ใช้-R
สำหรับอินพุตหลายบรรทัด
Perl
ใน Perl URI::Escape
คุณสามารถใช้
decoded_url=$(perl -MURI::Escape -e 'print uri_unescape($ARGV[0])' "$encoded_url")
หรือเพื่อประมวลผลไฟล์:
perl -i -MURI::Escape -e 'print uri_unescape($ARGV[0])' file
awk
ลองอานนท์แก้ปัญหา:
awk -niord '{printf RT?$0chr("0x"substr(RT,2)):$0}' RS=%..
หมายเหตุ: พารามิเตอร์-n
เป็นเฉพาะกับ awk
GNU
ดู: การใช้ printf awk เพื่อ urldecode ข้อความ
การถอดรหัสชื่อไฟล์
หากคุณต้องการลบการเข้ารหัส URL ออกจากชื่อไฟล์ให้ใช้deurlname
เครื่องมือจากrenameutils
(เช่นdeurlname *.*
)
ดูสิ่งนี้ด้วย:
ที่เกี่ยวข้อง: