จะแทนที่สตริงย่อย UTF-8 ที่เข้ารหัสเปอร์เซ็นต์ทั้งหมดด้วยข้อความ UTF-8 ธรรมดาได้อย่างไร


9

ฉันมีไฟล์ html ที่มีข้อความ UTF-8 เข้ารหัส%% ใน URL

ตัวอย่างเช่น "% D1% 80% D0% B5% D1% 81% D1% 83% D1% 80% D1% 81% D1% 8B" ย่อมาจาก "ресурсы" ("ทรัพยากร" ในรัสเซีย)

ภารกิจคือการแทนที่สตริงย่อยทั้งหมดด้วยข้อความ UTF-8 ที่อ่านได้

เพื่อให้งานง่ายขึ้นเราสามารถพิจารณาได้ว่าไม่มี%การใช้เครื่องหมายอื่น ๆในไฟล์ ตัวเลขตัวอักษรสามารถเป็นได้ทั้งตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก

ฉันสงสัยว่านี้สามารถทำได้อย่างหรูหราด้วยsed, perl, awkหรือบางสิ่งบางอย่าง แต่ไม่ทราบว่า

เว็บแอปพลิเคชั่นนี้ดูเหมือนจะหลอกลวงด้วยข้อความที่คุณวางไว้ที่นั่น

คำตอบ:


9

ด้วยการทุบตี zsh, GNU สะท้อนหรือการใช้งานของ ksh ในบางระบบบางส่วนนี้สามารถถอดรหัสได้ง่ายๆโดยecho -eหลังจากเปลี่ยนทั้งหมดด้วย%\x

url_encoded_string="%D1%80%D0%B5%D1%81%D1%83%D1%80%D1%81%D1%8B"
temp_string=${url_encoded_string//%/\\x}

printf '%s\n' "$temp_string"
# output: \xD1\x80\xD0\xB5\xD1\x81\xD1\x83\xD1\x80\xD1\x81\xD1\x8B

echo -e "$temp_string"
# output: ресурсы

(ถือว่าเป็นสตริงเองไม่มีอักขระเครื่องหมายทับขวาและไม่ใช่หนึ่งในตัวเลือกที่สนับสนุนโดยechoคำสั่งของคุณ)

@JoshLee ชี้ให้เห็นว่า "echo caveat" สามารถหลีกเลี่ยงได้โดยใช้โดยตรง:

printf ${url_encoded_string//%/\\x}

แทนโดยตรงหลังคำสั่งแรก


โปรดทราบว่าโซลูชันที่สวยงามนี้จะทำงานกับการเข้ารหัสใด ๆไม่ใช่แค่ UTF-8 (เช่นกำจัดการเข้ารหัสสำหรับ ~ และอื่น ๆ เคล็ดลับอีกวิธีในการเพิ่มลงในกล่องเครื่องมือของฉันขอบคุณ!
vonbrand

5

ด้วย Perl:

perl -pe 's/%([0-9A-F]{2})/pack"H2",$1/gei'

หรือด้วยURI::Escape:

perl -MURI::Escape -pe '$_=uri_unescape$_'

ฉันรักสิ่งนี้เพราะฉันสามารถท่อมันได้ทุกอย่างที่ฉันต้องการขอบคุณ$_ gnu.org/software/bash/manual/html_node/Special-Parameters.html
Nemo

@Nemo, $_ที่นี่คือperl's $_ไม่bash' s ร่วมกับ-pตัวเลือกการแสดงออก Perl มีการเรียกใช้สำหรับบันทึกทุกท่าน (บันทึกการอ่านจากไฟล์ที่ได้รับการโต้แย้งหรือ stdin หากไม่มีข้อโต้แย้งให้บริการ) $_กับระเบียนปัจจุบันเก็บไว้ใน ที่คล้ายกับ'sawk $0
Stéphane Chazelas

0

มีโปรแกรมที่เรียกว่าconvmvซึ่งสามารถช่วยคุณได้

convmv --unescape /some_path/target_fileเพียงแค่ใช้ มันจะทำแห้ง

เมื่อคุณได้รับการยืนยันใช้convmv --notest --unescape /some_path/target_fileเพื่อดำเนินการต่อ

โฮมเพจของโปรแกรมนี้คือ: http://j3e.de/linux/convmv/

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.