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

Загрузите пакеты .deb и установите их с помощью sudo dpkg -i *.deb.

Чтобы загрузить их:

wget http://archive.ubuntu.com/ubuntu/pool/main/l/language-pack-gnome-id-base/language-pack-gnome-id-base_12.04+20120417_all.deb
wget http://archive.ubuntu.com/ubuntu/pool/main/l/language-pack-id-base/language-pack-id-base_12.04+20120417_all.deb
wget http://archive.ubuntu.com/ubuntu/pool/main/l/language-pack-id/language-pack-id_12.04+20120417_all.deb
wget http://archive.ubuntu.com/ubuntu/pool/main/l/language-pack-gnome-id/language-pack-gnome-id_12.04+20120417_all.deb
wget http://archive.ubuntu.com/ubuntu/pool/main/f/firefox/firefox-locale-id_11.0+build1-0ubuntu4_all.deb
wget http://archive.ubuntu.com/ubuntu/pool/main/libr/libreoffice/libreoffice-l10n-id_3.5.2-2ubuntu1_all.deb
wget http://archive.ubuntu.com/ubuntu/pool/main/o/openoffice.org-hyphenation/openoffice.org-hyphenation_0.6_all.deb
wget http://archive.ubuntu.com/ubuntu/pool/main/p/poppler-data/poppler-data_0.4.5-2_all.deb
wget http://archive.ubuntu.com/ubuntu/pool/main/t/thunderbird/thunderbird-locale-id_11.0.1+build1-0ubuntu2_all.deb
29
задан 20 July 2011 в 02:45

49 ответов

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

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.

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

33
ответ дан 25 May 2018 в 19:44
  • 1
    Что это за символ æ в конце первой строки? Редактировать: отвечая на себя - получилось, это всего лишь одна символьная кодировка UTF8, например :-) – TMG 8 January 2018 в 14:03

shell

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

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

Вы можете определить его как псевдоним и добавить его в файлы оболочки rc: [ ! d3] $ 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.

Вы также можете использовать следующие функции 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 () предполагает, что данные не содержат обратную косую черту.

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, также в stackableflow.

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

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

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 вы можете использовать cist's gist file .

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=%..

См. anon .

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

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

См. Также:

Может ли wget декодировать имена файлов uri при загрузке в пакетном режиме? Как удалить кодировку URI из имен файлов?

Связано:

Может ли wget декодировать имена файлов uri при загрузке в пакетном режиме? Может ли wget декодировать имена файлов uri при загрузке в пакетном режиме? в unix SE
33
ответ дан 31 July 2018 в 10:32

shell

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

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

Вы можете определить его как псевдоним и добавить его в файлы оболочки rc: [ ! d3] $ 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.

Вы также можете использовать следующие функции 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 () предполагает, что данные не содержат обратную косую черту.

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, также в stackableflow.

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

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

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 вы можете использовать cist's gist file .

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=%..

См. anon .

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

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

См. Также:

Может ли wget декодировать имена файлов uri при загрузке в пакетном режиме? Как удалить кодировку URI из имен файлов?

Связано:

Может ли wget декодировать имена файлов uri при загрузке в пакетном режиме? Может ли wget декодировать имена файлов uri при загрузке в пакетном режиме? в unix SE
33
ответ дан 31 July 2018 в 11:33

shell

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

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

Вы можете определить его как псевдоним и добавить его в файлы оболочки rc: [ ! d3] $ 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.

Вы также можете использовать следующие функции 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 () предполагает, что данные не содержат обратную косую черту.

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, также в stackableflow.

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

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

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 вы можете использовать cist's gist file .

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=%..

См. anon .

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

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

См. Также:

Может ли wget декодировать имена файлов uri при загрузке в пакетном режиме? Как удалить кодировку URI из имен файлов?

Связано:

Может ли wget декодировать имена файлов uri при загрузке в пакетном режиме? Может ли wget декодировать имена файлов uri при загрузке в пакетном режиме? в unix SE
33
ответ дан 2 August 2018 в 03:11

shell

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

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

Вы можете определить его как псевдоним и добавить его в файлы оболочки rc: [ ! d3] $ 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.

Вы также можете использовать следующие функции 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 () предполагает, что данные не содержат обратную косую черту.

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, также в stackableflow.

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

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

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 вы можете использовать cist's gist file .

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=%..

См. anon .

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

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

См. Также:

Может ли wget декодировать имена файлов uri при загрузке в пакетном режиме? Как удалить кодировку URI из имен файлов?

Связано:

Может ли wget декодировать имена файлов uri при загрузке в пакетном режиме? Может ли wget декодировать имена файлов uri при загрузке в пакетном режиме? в unix SE
33
ответ дан 4 August 2018 в 19:04

shell

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

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

Вы можете определить его как псевдоним и добавить его в файлы оболочки rc: [ ! d3] $ 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.

Вы также можете использовать следующие функции 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 () предполагает, что данные не содержат обратную косую черту.

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, также в stackableflow.

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

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

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 вы можете использовать cist's gist file .

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=%..

См. anon .

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

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

См. Также:

Может ли wget декодировать имена файлов uri при загрузке в пакетном режиме? Как удалить кодировку URI из имен файлов?

Связано:

Может ли wget декодировать имена файлов uri при загрузке в пакетном режиме? Может ли wget декодировать имена файлов uri при загрузке в пакетном режиме? в unix SE
33
ответ дан 6 August 2018 в 03:23

shell

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

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

Вы можете определить его как псевдоним и добавить его в файлы оболочки rc: [ ! d3] $ 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.

Вы также можете использовать следующие функции 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 () предполагает, что данные не содержат обратную косую черту.

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, также в stackableflow.

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

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

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 вы можете использовать cist's gist file .

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=%..

См. anon .

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

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

См. Также:

Может ли wget декодировать имена файлов uri при загрузке в пакетном режиме? Как удалить кодировку URI из имен файлов?

Связано:

Может ли wget декодировать имена файлов uri при загрузке в пакетном режиме? Может ли wget декодировать имена файлов uri при загрузке в пакетном режиме? в unix SE
33
ответ дан 7 August 2018 в 21:09

shell

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

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

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

$ 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.

Вы также можете использовать следующие функции 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 () предполагает, что данные не содержат обратную косую черту.

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, также в stackableflow.

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

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

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 вы можете использовать cist's gist file .

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=%..

См. anon .

[!d46 ]

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

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

См. Также:

Может ли wget декодировать имена файлов uri при загрузке в пакетном режиме? Как удалить кодировку URI из имен файлов?

Связано:

Может ли wget декодировать имена файлов uri при загрузке в пакетном режиме? Может ли wget декодировать имена файлов uri при загрузке в пакетном режиме? в unix SE
24
ответ дан 25 May 2018 в 19:44

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

Percent-encode все символы, кроме 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.

7
ответ дан 25 May 2018 в 19:44

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

$ a='%C3%A6ndr%C3%BCk'
$ echo -e "${a//%/\\x}"
ændrük
5
ответ дан 25 May 2018 в 19:44

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

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

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

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

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

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

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

Итак, наконец, 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
4
ответ дан 25 May 2018 в 19:44
  • 1
    Я думаю, что sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1] может быть более уместным. Особенно если вы используете это в скриптах и ​​случайно даете пустой первый аргумент. – muru 16 July 2015 в 05:16
  • 2
    По комментарию @muru я изменил проверку аргумента в командной строке. Это было: len(sys.argv) < 2 and sys.stdin.read()[0:-1] or sys.argv[1] Теперь: sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1] То есть, если есть даже пустой первый аргумент, команда не ждет ввода со стандартного ввода, но обрабатывает пустой аргумент. – DIG mbl 16 July 2015 в 16:56

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

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

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

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

3
ответ дан 25 May 2018 в 19:44

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

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
ответ дан 25 May 2018 в 19:44

shell

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

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

Вы можете определить его как псевдоним и добавить его в файлы оболочки rc: [ ! d3] $ 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.

Вы также можете использовать следующие функции 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 () предполагает, что данные не содержат обратную косую черту.

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, также в stackableflow.

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

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

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 вы можете использовать cist's gist file .

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=%..

См. anon .

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

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

См. Также:

Может ли wget декодировать имена файлов uri при загрузке в пакетном режиме? Как удалить кодировку URI из имен файлов?

Связано:

Может ли wget декодировать имена файлов uri при загрузке в пакетном режиме? Может ли wget декодировать имена файлов uri при загрузке в пакетном режиме? в unix SE
26
ответ дан 25 July 2018 в 21:34
  • 1
    Что это за символ æ в конце первой строки? Редактировать: отвечая на себя - получилось, это всего лишь одна символьная кодировка UTF8, например :-) – TMG 8 January 2018 в 14:03

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

Лично я использую эти псевдонимы для кодирования и декодирования 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 псевдоним в 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
4
ответ дан 25 July 2018 в 21:34
  • 1
    Я думаю, что sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1] может быть более уместным. Особенно если вы используете это в скриптах и ​​случайно даете пустой первый аргумент. – muru 16 July 2015 в 05:16
  • 2
    По комментарию @muru я изменил проверку аргумента в командной строке. Это было: len(sys.argv) < 2 and sys.stdin.read()[0:-1] or sys.argv[1] Теперь: sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1] То есть, если есть даже пустой первый аргумент, команда не ждет ввода со стандартного ввода, но обрабатывает пустой аргумент. – DIG mbl 16 July 2015 в 16:56

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

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

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

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

3
ответ дан 25 July 2018 в 21:34

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

$ a='%C3%A6ndr%C3%BCk' $ echo -e "${a//%/\\x}" ændrük
5
ответ дан 25 July 2018 в 21:34

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

Percent-encode все символы, кроме 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.

7
ответ дан 25 July 2018 в 21:34

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

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
ответ дан 25 July 2018 в 21:34

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

Лично я использую эти псевдонимы для кодирования и декодирования 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 псевдоним в 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
4
ответ дан 31 July 2018 в 10:32
  • 1
    Я думаю, что sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1] может быть более уместным. Особенно если вы используете это в скриптах и ​​случайно даете пустой первый аргумент. – muru 16 July 2015 в 05:16
  • 2
    По комментарию @muru я изменил проверку аргумента в командной строке. Это было: len(sys.argv) < 2 and sys.stdin.read()[0:-1] or sys.argv[1] Теперь: sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1] То есть, если есть даже пустой первый аргумент, команда не ждет ввода со стандартного ввода, но обрабатывает пустой аргумент. – DIG mbl 16 July 2015 в 16:56

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

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

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

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

3
ответ дан 31 July 2018 в 10:32

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

$ a='%C3%A6ndr%C3%BCk' $ echo -e "${a//%/\\x}" ændrük
5
ответ дан 31 July 2018 в 10:32

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

Percent-encode все символы, кроме 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.

7
ответ дан 31 July 2018 в 10:32

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

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
ответ дан 31 July 2018 в 10:32

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

Лично я использую эти псевдонимы для кодирования и декодирования 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 псевдоним в 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
4
ответ дан 31 July 2018 в 11:33
  • 1
    Я думаю, что sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1] может быть более уместным. Особенно если вы используете это в скриптах и ​​случайно даете пустой первый аргумент. – muru 16 July 2015 в 05:16
  • 2
    По комментарию @muru я изменил проверку аргумента в командной строке. Это было: len(sys.argv) < 2 and sys.stdin.read()[0:-1] or sys.argv[1] Теперь: sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1] То есть, если есть даже пустой первый аргумент, команда не ждет ввода со стандартного ввода, но обрабатывает пустой аргумент. – DIG mbl 16 July 2015 в 16:56

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

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

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

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

3
ответ дан 31 July 2018 в 11:33

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

$ a='%C3%A6ndr%C3%BCk' $ echo -e "${a//%/\\x}" ændrük
5
ответ дан 31 July 2018 в 11:33

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

Percent-encode все символы, кроме 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.

7
ответ дан 31 July 2018 в 11:33

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

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
ответ дан 31 July 2018 в 11:33

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

Лично я использую эти псевдонимы для кодирования и декодирования 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 псевдоним в 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
4
ответ дан 2 August 2018 в 03:11
  • 1
    Я думаю, что sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1] может быть более уместным. Особенно если вы используете это в скриптах и ​​случайно даете пустой первый аргумент. – muru 16 July 2015 в 05:16
  • 2
    По комментарию @muru я изменил проверку аргумента в командной строке. Это было: len(sys.argv) < 2 and sys.stdin.read()[0:-1] or sys.argv[1] Теперь: sys.argv[1] if len(sys.argv) > 1 else sys.stdin.read()[0:-1] То есть, если есть даже пустой первый аргумент, команда не ждет ввода со стандартного ввода, но обрабатывает пустой аргумент. – DIG mbl 16 July 2015 в 16:56

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

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