2010-07-07 4 views
1

J'écris un script bash qui doit analyser html qui inclut des caractères spéciaux tels que @!'ó. Actuellement, le script entier est en cours d'exécution et il ignore ou déclenche ces requêtes car elles sont renvoyées par le serveur sous la forme d'unicode décimal comme ceci: '. J'ai trouvé comment analyser et convertir en hexadécimal et les charger en python pour les convertir à leurs symboles et je me demande si bash peut faire cette conversion finale nativement. Exemple simple en python:Bash équivalent au littéral de chaîne de Python pour la conversion de chaîne utf

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

imprime

[email protected] 

Puis-je obtenir le même résultat dans Bash? J'ai regardé iconv mais je ne pense pas qu'il peut faire ce que je veux, ou plus probablement je ne sais pas comment.

Voici quelques informations pertinentes:

Python String Literals

Hex to UTF conversion in Python

Et voici quelques exemples d'entrée-sortie attendue.

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

vous ne pouvez pas appeler python ou Perl de ce script bash pour traiter la chaîne? – mykhal

+0

presque fait: 'echo 'А л и с А (Alisa)' | perl -pe 's/& # (\ d +); (? {$ x = sprintf ("% 04x", int ($ 1))})/\ N {U + $ x}/g'' malheureusement, il y a un problème avec la conversion '$ x', de sorte que les caractères unicode sont erronés – mykhal

Répondre

2

Le printf builtin Bash ne prend pas en charge les codes Unicode, mais le printf externe (au moins sur mon système basé sur GNU) fait:

$ /usr/bin/printf "\u0410\u043b\u0438\u0441\u0410" 
АлисА 

ou ce qui sélectionne printf de votre chemin dans le cas où il est pas /usr/bin:

$ $(type -P printf) "\u0410\u043b\u0438\u0441\u0410" 
АлисА 

ou

$ env printf "\u0410\u043b\u0438\u0441\u0410" 
АлисА 
+0

Dennis Williamson: c'est beaucoup mieux que d'envoyer une chaîne à un python/perl/quel que soit un liner – mykhal

+0

Merci! Je pensais que ça ne devrait pas être aussi difficile que je le pensais mais maintenant que je suis en train de regarder en python ça a l'air assez attrayant pour apprendre. – dmikalova

+0

Sans oublier que quelqu'un a déjà fait des modules pour encoder et décoder html. – dmikalova

1

solution possible, par exemple .:

$ 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

si' UnicodeEncodeError' se produit, ajoutez 'reload (sys); sys.setdefaultencoding ("UTF-8"); 'après' import re, sys; ' – mykhal

+0

Merci! Je suis encore novice en matière de programmation, et je me demande si l'appel de python ou d'autres langages entraîne une utilisation considérable des ressources du système. – dmikalova

+0

@teratomata oui, c'est lent. lancement de par ex. perl est considérablement fater que python.mais je serais encore plus lent que si vous pouviez le faire dans bash (echo) directement – mykhal

Questions connexes