Как я могу закодировать и декодировать закодированные процентом строки на командной строке?

Как я могу закодировать и декодировать закодированный процентом (закодированный URL) строки на командной строке?

Я ищу решение, которое может сделать это:

$ percent-encode "ændrük"
%C3%A6ndr%C3%BCk
$ percent-decode "%C3%A6ndr%C3%BCk"
ændrük
31
задан 19 July 2011 в 14:45

8 ответов

Эти команды делают то, что Вы хотите:

python -c "import urllib, sys; print urllib.quote(sys.argv[1])" æ
python -c "import urllib, sys; print urllib.unquote(sys.argv[1])" %C3%A6

Если Вы хотите закодировать пробелы как +, замена urllib.quote с urllib.quote_plus.

Я предполагаю, что Вы захотите исказить их ;-)

35
ответ дан 23 November 2019 в 00:40

Я нашел пакет, renameutils, это содержит утилиту deurlname это может переименовать файл, содержащий "закодированные процентом" символы.

К сожалению, это не декодирует stdin или параметр командной строки, но только переименовывает файл, таким образом, необходимо создать фиктивный файл для получения декодирования (название переименованного файла), но с некоторым ударом, пишущим сценарий процесса, может быть автоматизирован.

Никакая информация о части кодирования, даже потому что это могло быть сомнительно который символы закодировать. Только неASCII?

Я думаю, что должен быть некоторый лучший инструмент/метод.

2
ответ дан 23 November 2019 в 00:40

оболочка

Попробуйте следующую командную строку:

$ echo "%C3%A6ndr%C3%BCk" | sed 's@+@ @g;s@%@\\x@g' | xargs -0 printf "%b"
ændrük

Можно определить его как псевдоним и добавить его к файлам дистанционного управления оболочки:

$ 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 () предполагает, что данные не содержат обратной косой черты.


колотите + 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.


Python

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

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])"'

Использование:

$ urlencode "ændrük"
C%26ndrC%3Ck
$ urldecode "%C3%A6ndr%C3%BCk"
ændrük

Источник: ruslanspivak


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

sed

Используя sed может быть достигнут:

cat file | sed -e's/%\([0-9A-F][0-9A-F]\)/\\\\\x\1/g' | xargs echo -e

awk

Попытка скоро решение:

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

См.: Используя awk printf к urldecode тексту.


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

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

См. также:


Похожие страницы:

27
ответ дан 23 November 2019 в 00:40

Чистое решение для удара для декодирования только:

$ a='%C3%A6ndr%C3%BCk'
$ echo -e "${a//%/\\x}"
ændrük
5
ответ дан 23 November 2019 в 00:40

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

Лично, я использую эти псевдонимы для кодирования 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])"'

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

обновите 16.07.2015 (пустой 1-й аргумент)

... согласно комментарию @muru.

обновите 28.05.2017 (кодирование наклонной черты)

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

Так, наконец urlencode псевдоним в ударе похож на это:

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
4
ответ дан 23 November 2019 в 00:40

Процент - кодирует зарезервированные символы URI и символы неASCII

jq -s -R -r @uri

-s (--slurp) чтения вводят строки в массив и -s -R (--slurp --raw-input) читает вход в единственную строку. -r (--raw-output) производит содержание строк вместо строковых литералов JSON.

Процент - кодирует все символы

xxd -p|tr -d \\n|sed 's/../%&/g'

tr -d \\n удаляет переводы строки, которые добавляются xxd -p после каждых 60 символов.

Процент - кодирует все символы кроме алфавитно-цифровых символов ASCII в Bash

eu () {
    local LC_ALL=C c
    while IFS= read -r -n1 -d '' c
    do 
        if [[ $c = [[:alnum:]] ]]
        then 
            printf %s "$c"
        else
            printf %%%02x "'$c"
        fi
    done
}

Без -d '' это пропустило бы переводы строки и пустые байты. Без IFS= это заменило бы символы в IFS с %00. Без LC_ALL=C это, например, заменило бы с %3042 в локали UTF-8.

8
ответ дан 23 November 2019 в 00:40

Вот функция Awk POSIX для кодирования:

function encodeURIComponent(str, j, q) {
  while (y++ < 125) z[sprintf("%c", y)] = y
  while (y = substr(str, ++j, 1))
    q = y ~ /[[:alnum:]_.!~*\47()-]/ ? q y : q sprintf("%%%02X", z[y])
  return q
}

Пример

0
ответ дан 23 November 2019 в 00:40

Подобный Stefano ansqer, но в Python 3:

python -c "import urllib.parse, sys; print(urllib.parse.quote(sys.argv[1]))" æ
python -c "import urllib.parse, sys; print(urllib.parse.unquote(sys.argv[1]))" %C3%A6

Закодировать также наклонные черты:

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

Больше информации о различии здесь.

1
ответ дан 23 November 2019 в 00:40

Другие вопросы по тегам:

Похожие вопросы: