Декодирование URL-кодирования (процентное кодирование)

Вопрос или проблема

Я хочу декодировать URL-кодировку, есть ли какой-либо встроенный инструмент для этого или может кто-нибудь предоставить мне код sed, который сделает это?

Я искал немного через unix.stackexchange.com и в интернете, но не смог найти никакого командного инструмента для декодирования url-кодировки.

Что я хочу сделать, так это отредактировать txt файл так, чтобы:

  • %21 становится !
  • %23 становится #
  • %24 становится $
  • %26 становится &
  • %27 становится '
  • %28 становится (
  • %29 становится )

И так далее.

Нашел однострочники Python, которые делают то, что вам нужно:

Python2

$ alias urldecode="python -c "import sys, urllib as ul; \
    print ul.unquote_plus(sys.argv[1])""

$ alias urlencode="python -c "import sys, urllib as ul; \
    print ul.quote_plus(sys.argv[1])""

Python3

$ alias urldecode="python3 -c "import sys, urllib.parse as ul; \
    print(ul.unquote_plus(sys.argv[1]))""

$ alias urlencode="python3 -c "import sys, urllib.parse as ul; \
    print (ul.quote_plus(sys.argv[1]))""

Пример

$ urldecode 'q+werty%3D%2F%3B'
q werty=/;

$ urlencode 'q werty=/;'
q+werty%3D%2F%3B

Ссылки

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

Bash

При скриптинге, вы можете использовать следующий синтаксис:

input="http%3A%2F%2Fwww"
decoded=$(printf '%b' "${input//%/\\x}")

Однако, вышеприведенный синтаксис неправильно обрабатывает плюсы (+), поэтому нужно заменить их на пробелы через sed или, как предложено @isaac, использовать следующий синтаксис:

decoded=$(input=${input//+/ }; printf "${input//%/\\x}")

Вы также можете использовать следующие функции urlencode() и urldecode():

urlencode() {
    # 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 '%%%02X' "'$c" ;;
        esac
    done
}

urldecode() {
    # urldecode <строка>

    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
}

Найдено в gist-файл cdown, также на stackoverflow.


PHP

Используя PHP, вы можете попробовать следующую команду:

$ echo oil+and+gas | php -r 'echo urldecode(fgets(STDIN));' // Или: 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

Попробуйте anon решение:

awk -niord '{printf RT?$0chr("0x"substr(RT,2)):$0}' RS=%..

Примечание: Параметр -n специфичен для GNU awk.

Попробуйте решение для urlencode от Stéphane Chazelas:

awk -v RS='&#[0-9]+;' -v ORS= '1;RT{printf("%%%02X", substr(RT,3))}'

См. также: Использование awk printf для декодирования текста url.

декодирование имен файлов

Если вам нужно удалить url-кодировку из имен файлов, используйте инструмент deurlname из renameutils (например, deurlname *.*).

Смотрите также:


Связанные:

В стандартной библиотеке Python есть встроенная функция для этого. В Python 2 это urllib.unquote.

decoded_url=$(python2 -c 'import sys, urllib; print urllib.unquote(sys.argv[1])' "$encoded_url")

Или для обработки файла:

python2 -c 'import sys, urllib; print urllib.unquote(sys.stdin.read())' <file >file.new &&
mv -f file.new file

В Python 3 это urllib.parse.unquote.

decoded_url=$(python3 -c 'import sys, urllib.parse; print(urllib.parse.unquote(sys.argv[1]))' "$encoded_url")

Или для обработки файла:

python3 -c 'import sys, urllib.parse; print(urllib.parse.unquote(sys.stdin.read()))' <file >file.new &&
mv -f file.new file

В Perl вы можете использовать URI::Escape.

decoded_url=$(perl -MURI::Escape -e 'print uri_unescape($ARGV[0])' "$encoded_url")

Или для обработки файла:

perl -pli -MURI::Escape -e '$_ = uri_unescape($_)' file

Если вы хотите использовать только инструменты, совместимые с POSIX, это неудобно, потому что единственным серьезным кандидатом является awk, который не разбирает шестнадцатеричные числа. См. Использование awk printf для декодирования текста url для примеров с общими реализациями awk, включая BusyBox.

Однострочник на Perl:

$ perl -pe 's/\%(\w\w)/chr hex $1/ge'

Пример:

$ echo '%21%22' |  perl -pe 's/\%(\w\w)/chr hex $1/ge'
!"

Или, если вы хотите игнорировать недопустимые последовательности, например %zz (которая будет испорчена выше):

$ perl -pe 's/\%([[:xdigit:]]{2})/chr hex $1/ge'

Если вы хотите использовать простую команду sed, то используйте следующую:

sed -e 's/%21/!/g' -e 's/%23/#/g' -e 's/%24/$/g' -e 's/%26/\&/g' -e "s/%27/'/g" -e 's/%28/(/g' -e 's/%29/)/g'

Но удобнее создать скрипт, например, sedscript:

s/%21/!/g
s/%23/#/g
s/%24/$/g
s/%26/\&/g
s/%27/'/g
s/%28/(/g
s/%29/)/g

Затем выполните sed -f sedscript < old > new, чтобы получить требуемый вывод.


Проще использовать команду urlencode, доступную напрямую в пакете gridsite-clients, которую можно установить с помощью (например, sudo apt-get install gridsite-clients в Ubuntu/Debian).

NAME

    urlencode – преобразование строк в URL-кодировку и обратно

SYNOPSIS

    urlencode [-m|-d] string [string ...]

ОПИСАНИЕ

    urlencode кодирует строки в соответствии с RFC 1738.

    То есть символы AZ, az, 09, ., _ и - остаются неизменными, но все остальные символы представлены в виде %HH, где HH – это их двухзначное шестнадцатеричное ASCII представление. Например, URL http://www.gridpp.ac.uk/ становится http%3A%2F%2Fwww.gridpp.ac.uk%2F

    urlencode преобразует каждый символ во всех строках, указанных в командной строке. Если указано несколько строк, они конкатенируются с разделяющими пробелами до преобразования.

OPTIONS

    -m
      Вместо полного преобразования выполняет “мягкую URL-кодировку” GridSite, в которой символы A-Z, a-z, 0-9, . = – _ @ и / остаются неизменными. Это дает несколько более читаемые строки, но приложение должно быть готово создать или симулировать требуемые директории, указанные слэшами.

    -d

      Выполнить раскодировку URL вместо кодировки, в соответствии с RFC 1738. %HH и %hh преобразуются, а другие символы остаются неизменными, за исключением того, что + преобразуется в пробел.

Пример декодирования URL:

$ urlencode -d "http%3a%2f%2funix.stackexchange.com%2f"
http://unix.stackexchange.com/

$ urlencode -d "Example: %21, %22, . . . , %29 etc"
Example: !, ", . . . , ) etc

Я не могу оставить комментарий по лучшему ответу в этом обсуждении, так что вот мой.

Лично я использую эти алиасы для кодирования и декодирования URL:

alias urlencode="python -c "import urllib, sys; print urllib.quote(  sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1])""

alias urldecode="python -c "import urllib, sys; print urllib.unquote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1])""

Обе команды позволяют вам преобразовывать данные, переданные в качествеаргумента командной строки или читать их из стандартного ввода, потому что обе однострочники проверяют, есть ли аргументы командной строки (даже пустые) и обрабатывают их, или просто читают стандартный ввод иначе.


обновление 2017-05-23 (кодирование слэша)

В ответ на комментарий @Bevor.

Если вам нужно также закодировать слэш, просто добавьте пустой второй аргумент к функции quote, тогда слэш будет также закодирован.

Итак, наконец, алиас urlencode в bash выглядит так:

alias urlencode="python -c "import urllib, sys; print urllib.quote(sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1], \"\")""

Пример

$ urlencode "Проба пера/Pen test"
%D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test

$ echo "Проба пера/Pen test" | urlencode
%D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test

$ urldecode %D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test
Проба пера/Pen test

$ echo "%D0%9F%D1%80%D0%BE%D0%B1%D0%B0%20%D0%BF%D0%B5%D1%80%D0%B0%2FPen%20test" | urldecode
Проба пера/Pen test

$ urlencode "Проба пера/Pen test" | urldecode
Проба пера/Pen test

$ echo "Проба пера/Pen test" | urlencode | urldecode
Проба пера/Pen test

GNU Awk

#!/usr/bin/awk -fn
@include "ord"
BEGIN {
   RS = "%.."
}
{
   printf "%s", $0
   if (RT != "") {
      printf "%s", chr("0x" substr(RT, 2)) 
   }
}

И еще один подход на Perl:

#!/usr/bin/env perl
use URI::Encode;
my $uri     = URI::Encode->new( { encode_reserved => 0 } );
while (<>) {

    print $uri->decode($_)
}

Вам потребуется установить модуль URI::Encode. В моем случае на Debian я мог просто выполнить

sudo apt-get install liburi-encode-perl

Затем я запустил скрипт выше на тестовом файле, содержащем:

http://foo%21asd%23asd%24%26asd%27asd%28asd%29

Результат был следующий (я сохранил скрипт как foo.pl):

$ ./foo.pl
http://foo!asd#asd$&asd'asd(asd)

Еще одно решение с использованием ruby (приемлемый ответ на python для меня не работал)

alias urldecode="ruby -e "require \"cgi\"; puts CGI.unescape(ARGV[0])""
alias urlencode="ruby -e "require \"cgi\"; puts CGI.escape(ARGV[0])""

Пример

$ urldecode 'q+werty%3D%2F%3B'
q werty=/;

$ urlencode 'q werty=/;'
q+werty%3D%2F%3B

Ответ в (в основном Posix) shell:

$ input="%21%22"
$ printf "`printf "%s\n" "$input" | sed -e 's/+/ /g' -e 's/%\(..\)/\\\\x\1/g'`"
!"

Объяснение:

  • -e 's/+/ /g преобразует каждое + в пробел (как описано в норме url-encode)
  • -e 's/%\(..\)/\\\\x\1/g' преобразует каждое %XX в \\xXX. Обратите внимание, что одна из \ будет удалена правилами цитирования.
  • Внутренний printf просто там, чтобы передать ввод в sed. Мы можем заменить это на любой другой механизм
  • Внешний printf интерпретирует \\xXX последовательности и выводит результат.

Правка:

Так как % всегда должен интерпретироваться в URL, возможно упростить этот ответ. В дополнение, я думаю, что чище использовать xargs вместо обратных кавычек (спасибо @josch).

$ input="%21%22+%25"
$ printf "%s\n" "$input" | sed -e 's/+/ /g; s/%/\\x/g' | xargs -0 printf
!" %

К сожалению, (как заметил @josch) ни одно из этих решений не соответствует стандарту Posix, так как последовательность escape \x не определена в Posix.

Вот функция BASH, делающая именно это:

function urldecode() {
        echo -ne $(echo -n "$1" | sed -E "s/%/\\\\x/g")
}

Только оболочка:

$ x='a%20%25%e3%81%82';printf "${x//\%/\\x}"
a %あ

Добавьте -- или %b чтобы предотвратить обработку аргументов, начинающихся с тире, как опции.

В zsh ${x//%/a} добавляет a в конец, но ${x//\%/a} заменяет % на a.

Вот соответствующие фрагменты из другого скрипта (который я только что беззастенчиво “украл” из моего скрипта загрузки youtube.com в другом ответе), который я написал ранее. Он использует sed и оболочку для создания рабочего urldecode.

set \! \" \# \$ \% \& \' \( \) \* \ \+ \, \/ \: \; \= \? \@ \[ \]
for c do set "$@" "'$c" "$c"; shift; done
curl -s "$url" | sed 's/\\u0026/\&/g;'"$(
    printf 's/%%%X/\\%s/g;' "$@"
)"

Я не буду клястся, что он всеобъемлющий — и на самом деле я сомневаюсь в этом — но он прекрасно справлялся с youtube.

Используя Raku (ранее известный как Perl_6)

Используя модуль Raku URI::Encode, который заявляет о соответствии RFC3986 (как и модули Perl5 URI::Encode и/или URI::Escape):

~$ raku -MURI::Encode -ne 'put uri_decode($_);'  файл

Пример ввода данных:

http://www.example.com/?name=john%20doe&age=54

Пример вывода:

http://www.example.com/?name=john doe&age=54

Заметьте, если вы ищете более полнофункциональный URL-парсер, попробуйте модуль Raku URL. Пример вывода (ниже) с теми же входными данными, что и выше:

~$ raku -MURL -ne 'my $url = URL.new($_); .raku.put for $url;'  файл
URL.new(scheme => "http", username => Str, password => Str, hostname => "www.example.com", port => Int, path => [], query => {:age("54"), :name("john\%20doe")}, fragment => Str)

С подходом второго варианта вы можете извлечь только те элементы, которые вам действительно нужно декодировать, такие как подкомпонент URL query, и декодировать в виде пар ключей/значений:

~$ raku -MURL -MURI::Encode -ne 'my $url = URL.new($_); for $url.query.kv -> $k,$v {say $k => uri_decode($v)};'  файл
age => 54
name => john doe

https://github.com/raku-community-modules/URI-Encode
https://raku.land/cpan:TYIL/URL
https://raku.org

Простое решение для коротких строк (оболочка медленнорабатывающая):

$ str="q+werty%3D%2F%3B"
$ a=${str//+/ };printf "$(echo "${a//%/\\x}")\n"
q werty=/;

Из моего исследования этого вопроса, похоже, что реализации процентного кодирования подвержены двусмысленности в экстремальных случаях, таких как потенциальное несоответствие кодировки символов, неэкранированные символы, кодирование по-разному части запроса, возможность наличия двоичных и не-ASCII символов и т. д. Поэтому необходимо провести некоторый анализ и предположения о входных данных.

Ближе всего к специализированному инструменту находятся соответствующие функции в языках программирования, таких как функции urllib в Python, которые делают некоторые здравые предположения о данных URL, как видно по комментариям в коде cpython. Вот почему я считаю, что текущий лучший ответ является хорошим.

Как пример, я реализовал аналогичный алиас с использованием GNU Guile, так как он находится на пути по умолчанию в системе GNU Guix, где Python не обязательно будет присутствовать на пути. Я не могу прокомментировать надежность по сравнению с Python, Perl или другими решениями. Документация предлагает разбивать URL на ?, & и = и обрабатывать запрос отдельно от пути, а также разбивать путь на сегменты с помощью специальной функции и все равно быть готовым к ошибкам. Однако я доволен результатами при обработке полных строк URL, скопированных из браузера.

alias urldecode="guile -c "(use-modules (web uri))
                           (display (uri-decode (cadr (command-line))))
                           (newline)""

Модуль (web uri) предоставляет функцию uri-decode для декодирования URI. command-line передает аргументы. cadr выбирает второй элемент в списке (которым является URL в качестве первого аргумента после имени исполняемого файла, т. е. guile).

$ urldecode "http://ephsheir.uhsp.edu.ua/bitstream/handle/8989898989/2850/%d0%9c%d0%b0%d0%ba%d0%b5%d1%82%20%d0%9d%d0%b0%d1%80%d0%be%d0%b4%d0%bd%d0%b8%20%d0%bd%d0%b0%d0%b7%d0%b2%d0%b8.pdf?sequence=2&isAllowed=y"
http://ephsheir.uhsp.edu.ua/bitstream/handle/8989898989/2850/Макет Народни назви.pdf?sequence=2&isAllowed=y

Однострочник, когда нет алиаса:

$ guile -c "(use-modules (web uri)) (display (uri-decode (cadr (command-line)))) (newline)" "http://ephsheir.uhsp.edu.ua/bitstream/handle/8989898989/2850/%d0%9c%d0%b0%d0%ba%d0%b5%d1%82%20%d0%9d%d0%b0%d1%80%d0%be%d0%b4%d0%bd%d0%b8%20%d0%bd%d0%b0%d0%b7%d0%b2%d0%b8.pdf?sequence=2&isAllowed=y"
http://ephsheir.uhsp.edu.ua/bitstream/handle/8989898989/2850/Макет Народни назви.pdf?sequence=2&isAllowed=y

AIX/Solaris

Недавно это снова возникло, и я хотел версию без Python, которая бы работала на AIX/Solaris и т. д.

INPUTSTRING="test%20%21%22%23%24%25%3f%2f%2e%5ctest"
for C in `echo "${INPUTSTRING}" | sed 's/%\(..\)/ %\1 /g'`
do
  case "$C" in
    %*)
      echo $C | sed 's/%//' | (echo 16i; tr '[:lower:]' '[:upper:]'; echo P) | dc
      ;; 
    *)
      printf "%s" "$C"
      ;;
  esac
done

По сути, токенизирует строку и для каждого токена, если он не является % последовательностью, просто печатает его. В противном случае убирает % и пропускает его через dc с 16i радиксом.

Зависит от dc, sed и POSIX-функций printf (нет кодировки \x).

Вот оно в виде “1-liner”:

for C in `echo "test%20%21%22%23%24%25%3f%2f%2e%5ctest" | sed 's/%\(..\)/ %\1 /g'`; do case "$C" in %*) echo $C | sed 's/%//' | (echo 16i; tr '[:lower:]' '[:upper:]'; echo P) | dc ;; *) printf "%s" "$C" ;; esac; done

Это решение не использует sed, но zsh (конкретно про плагин .ohmyzsh), вы можете использовать функцию omz_urldecode, чтобы разобрать любую %## в читаемую строку:

omz_urldecode 'http://example.com/some%23'
#Вывод:
http://example.com/some#

Вы можете протестировать свои примеры %## с помощью цикла for:

for ((i=21; i<=29; i++)); do 
  omz_urldecode "http://example.com/exa_%${i}mple"
done

Вывод:

http://example.com/exa_!mple
http://example.com/exa_"mple
http://example.com/exa_#mple
http://example.com/exa_$mple
http://example.com/exa_%mple
http://example.com/exa_&mple
http://example.com/exa_'mple
http://example.com/exa_(mple
http://example.com/exa_)mple

Если у вас установлена ohmyzsh в системе, вы можете использовать эту команду в zsh, чтобы узнать, где определена эта функция:

type -a omz_urldecode
omz_urldecode is a shell function from /home/user/.oh-my-zsh/lib/functions.zsh

И чтобы увидеть, что содержит эта функция:

type -f omz_urldecode
#Вывод
omz_urldecode () {
        emulate -L zsh
        local encoded_url=$1 
        local caller_encoding=$langinfo[CODESET] 
        local LC_ALL=C 
        export LC_ALL
        local tmp=${encoded_url:gs/+/ /} 
        tmp=${tmp:gs/\\/\\\\/} 
        tmp=${tmp:gs/%/\\x/} 
        local decoded="$(printf -- "$tmp")" 
        local -a safe_encodings
        safe_encodings=(UTF-8 utf8 US-ASCII) 
        if [[ -z ${safe_encodings[(r)$caller_encoding]} ]]
        then
                decoded=$(echo -E "$decoded" | iconv -f UTF-8 -t $caller_encoding) 
                if [[ $? != 0 ]]
                then
                        echo "Error converting string from UTF-8 to $caller_encoding" >&2
                        return 1
                fi
        fi
        echo -E "$decoded"
}

Должно быть, изменил свой подход по сравнению с моим предыдущим комментарием, вероятно для быстрого инструмента установки вместо кодирования и/или любой ручной настройки.

Сейчас я использую это:

npm i -g url-cli
xout | url -dp | xio; # Linux + Алиасы
gc; gc | tr -d '\n' | url -dp | pc; gc; # Windows-Cygwin + Алиасы

Вот рабочий пример, который использует функцию оболочки dash: convert_uri_hex_encoded_string_to_ascii для преобразования URI hex закодированной строки в соответствующее ей ASCII строку значения:

#!/bin/dash

convert_uri_hex_encoded_string_to_ascii () {
    # $1 = входная переменная, содержащая (URI) шестнадцатерично закодированную строку (например: Hello%20World)
    # $2 = выходная переменная, содержащая ASCII значение, соответствующее $1

    eval initial_value=\"\$$1\"
    start_value1="$initial_value"
    start_value2=""
    while [ ! "$start_value1" = "$start_value2" ]; do
        end_value1="${start_value1#*"%"[a-zA-Z0-9][a-zA-Z0-9]}"
        start_value2="${start_value1%"$end_value1"}"
        start_value3="${start_value2%"%"[a-zA-Z0-9][a-zA-Z0-9]}"
        char="${start_value2#"$start_value3"}"
        if [ ! ${char#"%"} = ${char} ]; then

            char="${char#"%"}"
            char2="$(printf "$char"|sed 's/'$char'/\x'$char'/g')"; #Linux (включая dash shell)
            if [ ! "${char2#*"x"[a-zA-Z0-9][a-zA-Z0-9]}" = "$char2" ]; then char2="$(printf "\x$char")"; fi #Linux и MacOS (минус dash shell)

            start_value2="$start_value1"
            start_value1="$start_value3""$char2""$end_value1"
        else
            break
        fi
    done
    eval $2=\"\$start_value1\"
}

input_string='Hello%20World'
printf '%s\n' "Входная строка: $input_string"
convert_uri_hex_encoded_string_to_ascii input_string output_string
printf '%s\n' "Выходная строка: $output_string"

Ответ или решение

Теория

Вопрос о декодировании URL закодированных символов касается преобразования так называемых процентовых кодов в их исходные символы. Этот метод кодирования, известный как "percent encoding", используется для передачи данных через URL, чтобы избежать некорректной интерпретации символов с особыми назначениями, таких как пробелы, знаки пунктуации и подобные. Например, пробел кодируется как %20, знак ! как %21, и так далее. Проблема, обозначенная в вопросе, состоит в поиске эффективного способа декодирования таких значений обратно в читаемые текстовые символы, используя командную строку.

Пример

Предположим, у вас есть файл с URL закодированными данными, содержащими такие строки: http%3A%2F%2Fexample.com%2Fpath%3Fvar%3Dvalue%21. Здесь URL захватывает всю линию и необходимо перевести это в формат, который можно легко прочитать и используется в реальных случаях. Некоторые инструменты и языки программирования предоставляют встроенные функции для подобного преобразования, например, Python, Perl, Bash и другие.

Для решения данной задачи можно использовать следующие подходы:

  1. Python: как было упомянуто, Python предоставляет функции urllib.parse.unquote для расшифровки закодированных строк. Python также может быть использован в командной строке для однострочных команд.

    alias urldecode="python3 -c 'import sys, urllib.parse; print(urllib.parse.unquote(sys.stdin.read().strip()))'"

    Используя Python, мы можем декодировать текст из файла, просто подавая его на вход данной команды. Python предоставляет библиотеку, которая автоматически справляется с преобразованием символов.

  2. Sed и Bash: с помощью sed и оболочки Bash можно использовать принципы замены символов. Пример использования sed:

    sed -e 's/%21/!/g' -e 's/%22/"/g' -e 's/%23/#/g' -e 's/%24/$/g' < input_file > output_file

    Этот подход подходит для простых сценариев, но он не так эффективен для сложных закодированных строк или больших файлов, так как требуется много правило замены.

  3. Perl: Как альтернатива, Perl также предоставляет функции из модуля URI::Escape, который можно использовать для декодирования строк непосредственно в командной строке.

    perl -pe 's/%([0-9A-F]{2})/chr(hex($1))/ge' < input_file > output_file

    Этот однострочник в Perl берет каждый процентный код и переводит его в соответствующий символ путем вычисления его шестнадцатеричного значения.

  4. Использование awk: GNU Awk позволяет выполнять сложную текстовую обработку на основе регулярных выражений и представлять другое удобное решение для этой задачи.

    awk '{gsub(/%../, hex2char, $0)}; {print}' file

    Однако для такой обработки может потребоваться тщательная настройка обработки каждого символа, что может усложнить использование.

Применение

Выбор конкретного инструмента или языка программирования для декодирования URL закодированных строк зависит от доступности их на вашей системе, а также от ваших предпочтений и навыков. Python зачастую является наилучшим выбором благодаря своей простоте и распространённостью, но Perl или Bash с sed могут быть более удобными для простых задач или сценариев, где установка Python может быть нецелесообразной. Важно удостовериться, что выбранное вами решение обрабатывает все возможные формате, включая символы с особыми значениями, такие как пробелы (+), и иные экранированные символы.

При надлежащем выборе инструмента можно не только оптимизировать процесс декодирования, но и интегрировать его в скрипты, автоматически обновляющие данные в файлах, базах данных или сетевых запросах, что особенно полезно для задач системного администратора и в разработке веб-приложений, где нужно работать с URL закодированными данными.

Оцените материал
Добавить комментарий

Капча загружается...