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
Примітка. Вищенаведений синтаксис може не перетворюватися +
на пробіли, і він може їсти всі нові рядки.
Ви можете визначити його псевдонімом і додати його до файлів 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}")
Однак вище синтаксис не буде +
правильно обробляти плюси ( ), тому вам потрібно замінити їх пробілами через 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()
припускається, що дані не містять зворотної косої риски.
Ось подібну версію Джоела знайдено за посиланням: https://github.com/sixarm/urldecode.sh
bash + xxd
Функція Bash з 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
специфічний для GNU awk
.
Див.: Використання awk printf для urldecode тексту .
декодування імен файлів
Якщо вам потрібно видалити кодування URL з імен файлів, скористайтеся deurlname
інструментом renameutils
(наприклад deurlname *.*
).
Дивитися також:
Пов'язані: