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

29

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

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

$ percent-encode "ændrük"
%C3%A6ndr%C3%BCk
$ percent-decode "%C3%A6ndr%C3%BCk"
ændrük
    
задан ændrük 19.07.2011 в 22:23
источник

7 ответов

33

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

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 .

Я предполагаю, что вы захотите псевдоним ;-)

    
ответ дан Stefano Palazzo 19.07.2011 в 23:22
источник
26

оболочки

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

$ echo "%C3%A6ndr%C3%BCk" | sed '[email protected][email protected] @g;[email protected]%@\[email protected]' | xargs -0 printf "%b"
ændrük

Вы можете определить его как псевдоним и добавить его в файлы оболочки rc :

$ alias urldecode='sed "[email protected][email protected] @g;[email protected]%@\\[email protected]" | 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}"
}

Note that your urldecode() assumes the data contains no backslash.

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 .

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 может быть достигнуто путем:

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

AWK

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

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

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

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

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

См. также:

по теме:

ответ дан kenorb 14.05.2013 в 15:06
7

зарезервированные символы 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.

    
ответ дан user4669748 22.12.2015 в 03:26
5

Pure bash solution только для декодирования :

$ a='%C3%A6ndr%C3%BCk'
$ echo -e "${a//%/\x}"
ændrük
    
ответ дан loentar 09.10.2014 в 21:46
4

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

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

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

update 2015-07-16 (пустой 1-й аргумент)

... в соответствии с комментарием @muru.

update 2017-05-28 (косой чертой)

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

Итак, наконец, urlencode alias в 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
    
ответ дан DIG mbl 16.07.2015 в 01:47
3

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

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

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

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

    
ответ дан enzotib 19.07.2011 в 23:15
0

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

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

Пример

    
ответ дан Steven Penny 29.02.2016 в 02:42