Bash эквивалентно строковому литералу Python для преобразования строк в utf

1

Я пишу bash script, который должен анализировать html, который включает специальные символы, такие как @!'ó. В настоящее время у меня работает весь script, и он игнорирует или отключает эти запросы, потому что они возвращаются с сервера в виде десятичного unicode следующим образом: '. Я выяснил, как анализировать и преобразовывать в шестнадцатеричный код и загружать их в python, чтобы преобразовать их обратно в свои символы, и мне интересно, может ли bash сделать это окончательное преобразование изначально. Простой пример в python:

print ur"\u0032" ur"\u0033" ur"\u0040"

выводит

23@

Могу ли я достичь такого же результата в Bash? Я искал значок, но я не думаю, что он может делать то, что я хочу, или, более вероятно, я просто не знаю, как это сделать.

Вот некоторая релевантная информация:

Литералы строк Python

Преобразование 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)

  • 0
    Вы не можете вызвать Python или Perl из этого сценария Bash для обработки строки?
  • 0
    почти сделано так: echo 'АлисА (Alisa)' | perl -pe 's/&#(\d+);(?{$x=sprintf("%04x", int($1))})/\N{U+$x}/g' к сожалению, существует некоторая проблема с преобразование $x , так что символы Юникода неверны
Теги:
utf-8

2 ответа

2
Лучший ответ

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"
АлисА
  • 0
    Деннис Уильямсон: это намного лучше, чем посылать строку в какой-нибудь python / perl / любой однострочный
  • 0
    Спасибо! Я думал, что это не должно быть так сложно, как я думал, но теперь, когда я изучаю питон, он выглядит довольно привлекательно для изучения.
Показать ещё 1 комментарий
1

возможное решение, например:

$ 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)
  • 0
    если происходит UnicodeEncodeError , добавьте reload(sys); sys.setdefaultencoding("UTF-8"); после import re, sys;
  • 0
    Спасибо! Я все еще новичок в программировании, и мне интересно, вызывает ли вызов python или другие языки значительное использование системных ресурсов?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню