Я пишу bash script, который должен анализировать html, который включает специальные символы, такие как @!'ó
. В настоящее время у меня работает весь script, и он игнорирует или отключает эти запросы, потому что они возвращаются с сервера в виде десятичного unicode следующим образом: '
. Я выяснил, как анализировать и преобразовывать в шестнадцатеричный код и загружать их в python, чтобы преобразовать их обратно в свои символы, и мне интересно, может ли bash сделать это окончательное преобразование изначально. Простой пример в python:
print ur"\u0032" ur"\u0033" ur"\u0040"
выводит
23@
Могу ли я достичь такого же результата в Bash? Я искал значок, но я не думаю, что он может делать то, что я хочу, или, более вероятно, я просто не знаю, как это сделать.
Вот некоторая релевантная информация:
Преобразование Hex в UTF в Python
И вот несколько примеров ожидаемого ввода-вывода.
Ludwig van Beethoven - 5th Symphony and 6th Symphony ''Pastoral'' - Boston Symphony Orchestra - Charles Munch
Ludwig van Beethoven - 5th Symphony and 6th Symphony ''Pastoral'' - Boston Symphony Orchestra - Charles Munch
АлисА (Alisa) - Мы вместе. ХХ лет (My vmeste XX let)
АлисА (Alisa) - Мы вместе. ХХ лет (My vmeste XX let)
printf
встроенный в Bash не поддерживает коды Unicode, но внешний printf
(по крайней мере, в моей системе на основе GNU):
$ /usr/bin/printf "\u0410\u043b\u0438\u0441\u0410"
АлисА
или это, которое выбирает printf
из вашего пути, если оно не находится в /usr/bin
:
$ $(type -P printf) "\u0410\u043b\u0438\u0441\u0410"
АлисА
или
$ env printf "\u0410\u043b\u0438\u0441\u0410"
АлисА
возможное решение, например:
$ function conv() { echo $* | python -c 'import re, sys; print re.sub(r"&#(\d+);", lambda x: unichr(int(x.group(1))), sys.stdin.read()).rstrip()' ; }
$ conv 'АлисА (Alisa)'
АлисА (Alisa)
UnicodeEncodeError
, добавьте reload(sys); sys.setdefaultencoding("UTF-8");
после import re, sys;
echo 'АлисА (Alisa)' | perl -pe 's/&#(\d+);(?{$x=sprintf("%04x", int($1))})/\N{U+$x}/g'
к сожалению, существует некоторая проблема с преобразование$x
, так что символы Юникода неверны