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 символов.
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.