Вот преобразование в одну строку с использованием Lua, похожее на ответ blueyed за исключением того, что все незарезервированные символы RFC 3986 оставлены незакодированными (как этот ответ ):
url=$(echo 'print((arg[1]:gsub("([^%w%-%.%_%~])",function(c)return("%%%02X"):format(c:byte())end)))' | lua - "$1")
Кроме того, вам может потребоваться убедиться, что переводы строки в вашей строке преобразованы из LF в CRLF, и в этом случае вы можете вставить gsub("\r?\n", "\r\n")
в цепочку перед кодированием процента.
Вот вариант, который в нестандартном стиле application / x-www-form-urlencoded выполняет эту нормализацию новой строки, а также кодирует пробелы как '+' вместо '% 20 '(который, вероятно, может быть добавлен к фрагменту Perl с использованием аналогичной техники).
url=$(echo 'print((arg[1]:gsub("\r?\n", "\r\n"):gsub("([^%w%-%.%_%~ ]))",function(c)return("%%%02X"):format(c:byte())end):gsub(" ","+"))' | lua - "$1")