Я хочу расшифровать кодировку URL-адреса, есть ли встроенный инструмент для этого или кто-нибудь может предоставить мне sed
код, который это сделает?
Я немного поискал на unix.stackexchange.com и в Интернете, но не смог найти инструмента командной строки для декодирования кодировки URL.
Я хочу просто отредактировать txt
файл так, чтобы:
%21
становится!
%23
становится#
%24
становится$
%26
становится&
%27
становится'
%28
становится(
%29
становится)
И так далее.
shell-script
text-processing
sed
url
Отображаемое имя
источник
источник
Ответы:
Нашли эти лайнеры Python one, которые делают то, что вы хотите:
пример
Рекомендации
источник
cat your_lovely_file.csv| python -c "import sys, urllib as ul; [sys.stdout.write(ul.quote_plus(l)) for l in sys.stdin]"
python
3 по умолчанию это приведет к ошибке. Меняетсяpython
наpython2
помощь.python3
можно использоватьimport urllib.parse as ul
вместоimport urllib as ul
.СЕПГ
Попробуйте следующую командную строку:
или следующий вариант использования
echo -e
:Примечание. Приведенный выше синтаксис может не преобразовываться
+
в пробелы и может использовать все символы новой строки.Вы можете определить его как псевдоним и добавить его в rc- файлы вашей оболочки :
Тогда каждый раз, когда вам это нужно, просто идите с:
удар
При создании сценариев вы можете использовать следующий синтаксис:
Однако приведенный выше синтаксис не будет
+
правильно обрабатывать pluses ( ), поэтому вы должны заменить их пробелами черезsed
.Вы также можете использовать следующую
urlencode()
иurldecode()
функцию:Вот аналогичная версия Джоэла, найденная по адресу: https://github.com/sixarm/urldecode.sh
Баш + XXD
Функция Bash с
xxd
инструментом:Находится в gist-файле cdown , также в stackoverflow .
PHP
Используя PHP, вы можете попробовать следующую команду:
или просто:
Используйте
-R
для многострочного ввода.Perl
В Perl вы можете использовать
URI::Escape
.Или обработать файл:
AWK
Попробуйте другое решение:
Примечание. Параметр
-n
относится к GNUawk
.Смотрите: Использование awk printf для urldecode текста .
расшифровка имен файлов
Если вам нужно удалить кодировку URL из имен файлов, используйте
deurlname
инструмент изrenameutils
(напримерdeurlname *.*
).Смотрите также:
Связанный:
источник
awk
: Поскольку здесь используется библиотечная функция,chr()
существует высокая вероятность того, что она будет работать исключительно на GNU awk (gawk
). Однако, в этом случае вряд ли будет какой - либо эквивалент для POSIXawk
, так как-n
вариант ( с учетом не десятичных аргументов) IS гнуawk
специальности.sed
код дает мнеxargs: argument line too long
файл с ≥2164 строками.printf
этим, не учитывают, что URL может содержать экранированные знаки процента, например%25
. Вы передаете их в printf, не экранируя их для printf с другим знаком процента, например%%
.local LC_ALL=C
вверху, иначе все широкие символы (например, японский, китайский и т. Д.) Не будут правильно разбиты на байты.Для этого есть встроенная функция в стандартной библиотеке Python. В Python 2 это так
urllib.unquote
.Или обработать файл:
В Python 3 это так
urllib.parse.unquote
.Или обработать файл:
В Perl вы можете использовать
URI::Escape
.Или обработать файл:
Если вы хотите придерживаться переносимых инструментов POSIX, это неловко, потому что единственным серьезным кандидатом является awk, который не разбирает шестнадцатеричные числа. См. Использование awk printf для urldecode текста для примеров с общими реализациями awk, включая BusyBox.
источник
Если вы хотите использовать простую
sed
команду, то используйте следующее:Но удобнее создать скрипт вроде
sedscript
:Затем запустите
sed -f sedscript < old > new
, который будет выводить по вашему желанию.Для удобства команда
urlencode
также доступна непосредственно вgridsite-clients
пакете, из которого она может быть установлена (sudo apt-get install gridsite-clients
в системе Ubuntu / Debian).Пример декодирования URL:
источник
sed
гостях%20
escape-последовательность.s/%26/&/g
делает. (Я исправил это.)Perl один лайнер:
Пример:
источник
GNU awk
Или же
Конвертируйте процентный URL файла в локальный файл в bash
источник
Я не могу комментировать лучший ответ в этой теме , так что вот мой.
Лично я использую эти псевдонимы для кодирования и декодирования URL:
Обе команды позволяют вам преобразовывать данные, передаваемые в качестве аргумента командной строки, или читать их из стандартного ввода , поскольку обе строки указывают на наличие аргументов командной строки (даже пустых) и обрабатывают их или просто читают стандартный ввод в противном случае.
обновление 2017-05-23 (косая черта)
В ответ на комментарий @ Bevor.
Если вам также необходимо кодировать косую черту, просто добавьте второй пустой аргумент в функцию кавычек, тогда косая черта также будет закодирована.
Итак, наконец,
urlencode
псевдоним в bash выглядит так:пример
источник
И еще один подход Perl:
Вам нужно будет установить
URI::Encode
модуль. На моем Debian я мог просто запуститьЗатем я запустил скрипт выше для тестового файла, содержащего:
Результат был (я сохранил сценарий как
foo.pl
):источник
Ответ в (в основном Posix) оболочке:
Объяснение:
-e 's/+/ /g
преобразует каждый+
в пространство (как описано в норме кодирования URL)-e 's/%\(..\)/\\\\x\1/g'
преобразовать каждый%XX
в\\xXX
. Обратите внимание, что одно из них\
будет удалено правилами цитирования.\\xXX
последовательности и отображает результат.Редактировать:
Так как
%
всегда должен интерпретироваться в URL, можно упростить этот ответ. В оном, я думаю , что это уборщик использоватьxargs
вместо обратных кавычек (благодаря @josch).К сожалению, (как заметил @josch) ни одно из этих решений не является Posix-совместимым, поскольку
\x
escape-последовательность не определена в Posix.источник
... | sed 's/+/ /g;s/%\(..\)/\\\\x\1/g'
. Эта-e
опция может быть опущена здесь на самом деле ...printf
он встроенdash
и не распознает\x
выход. Вы можете использовать/usr/bin/printf
вместоprintf
того, чтобы заставить его работать. Как правило, вы должны быть в состоянии использоватьcommand printf
, но, похоже, не работает как следует. Продолжайте использовать встроенный.\x
экранирования не является частью POSIX: pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html Во время моих тестов я обнаружил еще одну проблему. Возможно, вы захотите заменить свое..
регулярное выражение,[a-zA-Z0-9][a-zA-Z0-9]
потому что в противном случае ввод, такой как «%%%», завершится неудачно. Я также добавилs/%/%%/g
в конце, чтобы убедиться, что экранирование процентов для printf.Shell только:
Добавьте
--
или,%b
чтобы аргументы, начинающиеся с тире, не рассматривались как параметры.В zsh
${x//%/a}
добавляетa
в конец, но${x//\%/a}
заменяет%
наa
.источник
Вот соответствующие биты из другого скрипта (который я просто бесстыдно украл из моего скрипта загрузки youtube.com из другого ответа), который я написал ранее. Он использует
sed
и оболочку для создания рабочего URL-кода.Я не буду клясться, что он всеобъемлющий - и на самом деле я в этом сомневаюсь - но он, безусловно, справился с YouTube.
источник
Вот функция BASH, чтобы сделать именно это:
источник
Другое решение, использующее ruby (принятый ответ python не работал для меня)
пример
источник