Нашел эти Python One Liners, которые делают то, что вы хотите:
$ 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])"'
$ 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 -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).
ИМЯ
urlencode - преобразование строк в или из URL-кодированной формы
. СИНОПСИС
urlencode [-m|-d] string [string ...]
DESCRIPTION
ВНИМАНИЕ
urlencode
кодирует строки согласно RFC 1738.That is, characters
A
-Z
a
-z
0
-9
.
_
и-
являются проходящие через немодифицированные, но все остальные символы представлены как %HH, где HH - их двузначное шестнадцатиричное ASCII представление. Например, URLhttp://www.gridpp.ac.uk/
становитсяhttp%3A%2F%2Fwww.gridpp.ac.uk%2F
urlencode
преобразует каждый символ во всех строках. данные в командной строке. Если дано несколько строк, они соединены с разделительными промежутками перед преобразованием.
-m
Вместо полного преобразования, сделайте на GridSite "мягкую URL-кодировку". в которых 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
Perl One Liner:
$ perl -pe 's/\%(\w\w)/chr hex $1/ge'
Пример:
$ echo '%21%22' | perl -pe 's/\%(\w\w)/chr hex $1/ge'
!"
GNU awk
#!/usr/bin/awk -fn
@include "ord"
BEGIN {
RS = "%.."
}
{
printf RT ? $0 chr("0x" substr(RT, 2)) : $0
}
или
#!/bin/sh
awk -niord '{printf RT?$0chr("0x"substr(RT,2)):$0}' RS=%..
Преобразовать URL-адрес файла в процентах в локальный файл в Bash
И еще один подход 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)
Вот являются соответствующими битами из другого сценария (что я просто бесстыдно украл из моего сценарий загрузки 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, конечно, достаточно.
Ответ в (в основном POSIX) оболочка:
$ input='%21%22'
$ printf "`printf "%s\n" "$input" | sed -e 's/+/ /g' -e 's/%\(..\)/\\\\x\1/g'`"
!"
Объяснение:
-E S / + / / G
преобразует каждый +
в пространстве (как описано в URL-кодированной норме) --E 'S /% \ (.. \) / \\\\\ X \ 1 / G '
Преобразование каждого % xx
в \\ xxx
. Обратите внимание, что один из \
будет удален путем цитирования правил. \\ XXX
последовательности и результат отображения. Редактировать:
С %
всегда следует интерпретировать в URL-адресах, можно упростить этот ответ. В дополнение, я думаю, что это более чистота для использования
вместо Backquotes (благодаря @josch).
$ input='%21%22+%25'
$ printf "%s\n" "$input" | sed -e 's/+/ /g; s/%/\\x/g' | xargs -0 printf
!" %
К сожалению, (как заметил @josch), ни один из этих решений не является соответствительным POSIX с \ x
\ x \ x .
Существует встроенная функция для этого в стандартной библиотеке 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; 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 -i -MURI::Escape -e 'print uri_unescape($ARGV[0])' file
Если вы хотите придерживаться портативных инструментов POSIX, это неловко, потому что единственный серьезный кандидат awk, который не разбирает шестнадцатеричные числа. См. Использование AWK PrintF в текст URLDECode для примеров с общими реализациями AWK, включая Bitebox.
Только для оболочки:
$ x='a%20%25%e3%81%82';printf "${x//\%/\\x}"
a %あ
Добавить --
или %b
, чтобы аргументы, начинающиеся с тире, не рассматривались как опции.
В zsh ${x//%/a}
добавляет a
в конец, но ${x//\%/a}
заменяет %
на a
.
Я не могу комментировать лучший ответ в этой ветке , поэтому вот мой.
Лично я использую эти псевдонимы для кодирования и декодирования 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])"'
Обе команды позволяют преобразовывать данные, передаваемые как аргумент командной строки , или считывать их из стандартного ввода , потому что оба однострочных файла проверяют наличие аргументов командной строки (даже пустых) и обрабатывают их или просто читают стандартный ввод.
В ответ на комментарий @ Bevor.
Если вам также нужно закодировать косую черту, просто добавьте пустой второй аргумент в функцию кавычек, тогда косая черта также будет закодирована.
Наконец, 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
Попробуйте следующую командную строку:
$ 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}")
Однако вышеприведенный синтаксис не будет правильно обрабатывать плюсы (+
), поэтому вам придется заменить их пробелами через 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
Функция 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, вы можете попробовать следующую команду:
$ 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 вы можете использовать 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
Попробуйте решение anon:
awk -niord '{printf RT?$0chr("0x"substr(RT,2)):$0}' RS=%..
Примечание: Параметр -n
специфичен для GNU awk
.
См: Использование awk printf для урлдекодирования текста.
Если вам нужно удалить url-кодировку из имен файлов, используйте инструмент deurlname
из renameutils
(например, deurlname *.*
).
См. также:
Связанные:
Вот функция BASH для выполнения именно этого:
function urldecode() {
echo -ne $(echo -n "$1" | sed -E "s/%/\\\\x/g")
}
Другое решение, использующее 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
Простое решение для коротких строк (оболочка работает медленноwww):
$ str='q+werty%3D%2F%3B'
$ a=${str//+/ };printf "$(echo "${a//%/\\x}")\n"
q werty=/;