Як замінити всі підстрочки, закодовані у відсотках 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

З bash, zsh, GNU echo або деякими реалізаціями 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, "застереження ехо" можна уникнути, використовуючи безпосередньо:

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

замість цього безпосередньо за першою командою.


Зауважте, що це елегантне рішення буде працювати з будь-яким кодуванням, а не лише з UTF-8 (тобто, позбудьтеся кодувань для ~ та інших. Ще одна хитрість, яку потрібно додати до моєї панелі інструментів. Дякую!
vonbrand

5

З перл:

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

Або з URI::Escape:

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

Мені це подобається, тому що я можу $_ передавати
Немо,

@Nemo, $_ось це perl's $_, не bash' s. У поєднанні з -pопцією, вираз perl запускається для кожного запису вводу (записи, які читаються з файлів, наведених як аргумент або stdin, якщо аргумент не наданий), з поточним записом, що зберігається в $_. Це схоже на awk's $0.
Стефан Шазелас

0

Існує програма, convmvяка називається, яка може вам допомогти.

Просто використовуйте convmv --unescape /some_path/target_file. Це зробить сухий пробіг.

Після підтвердження використовуйте convmv --notest --unescape /some_path/target_fileдля продовження.

Домашня сторінка цієї програми: http://j3e.de/linux/convmv/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.