СЕПГ
Попробуйте следующую командную строку:
$ 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}")
Однако приведенный выше синтаксис не будет +
правильно обрабатывать 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()
предполагается, что данные не содержат обратной косой черты.
Вот аналогичная версия Джоэла, найденная по адресу: https://github.com/sixarm/urldecode.sh
Баш + 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
}
Находится в gist-файле 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 *.*
).
Смотрите также:
Связанный: