Comment convertir facilement des entités spéciales HTML à partir d'un flux d'entrée standard sous Linux?

9

CentOS

Existe-t-il un moyen simple de convertir des entités HTML spéciales à partir d'un flux de données? Je passe des données à un script bash et parfois ces données incluent des entités spéciales. Par exemple:

"test" & amp; test $ test! test @ # $% ^ & amp; *

Je ne sais pas pourquoi certains personnages s'affichent bien et d'autres non, mais malheureusement, je n'ai pas le contrôle sur les données entrant.

Je pense que je pourrais peut-être utiliser SED ici, mais cela semble être lourd et éventuellement sujet à de faux positifs. Existe-t-il une commande Linux vers laquelle je pourrais me diriger et qui se spécialise dans le décodage de ce type de données?

Mike B
la source

Réponses:

9

PHP est bien adapté à cela. Cet exemple nécessite PHP 5:

cat file.html | php -R 'echo html_entity_decode($argn);'
Michael Hampton
la source
14

Perl est (comme toujours) votre ami. Je pense que cela le fera:

perl -n -mHTML::Entities -e ' ; print HTML::Entities::decode_entities($_) ;'

Par exemple:

echo '"test" & test $test ! test @ # $ % ^ & *' |perl -n -mHTML::Entities -e ' ; print HTML::Entities::decode_entities($_) ;'

Avec sortie:

someguy@somehost ~]$ echo '"test" & test $test ! test @ # $ % ^ & *' |perl -n -mHTML::Entities -e ' ; print HTML::Entities::decode_entities($_) ;'
"test" & test $test ! test @ # $ % ^ & *
Jason Tan
la source
Cela fonctionne sur mon ordinateur portable OSX10.8 et un hôte RHEL5.
Jason Tan
Pour sortir le fichier en UTF-8, utilisez binmode: echo "& laquo;" | perl -n -mHTML :: Entities -mutf8 -e 'binmode (STDOUT, ": utf8"); print HTML :: Entities :: decode_entities ($ _); '
falstaff
6

recode semble disponible sur les dépôts de paquets par défaut des principales distributions GNU / Linux. Par exemple, pour décoder des entités HTML en UTF-8:

…|recode html..utf8
Skippy le Grand Gourou
la source
2

Avec Python 3:

python3 -c 'import html,sys; print(html.unescape(sys.stdin.read()), end="")' < file.html
ariddell
la source
0

Prend le fichier texte de stdin:

#!/bin/bash
#
while read lin; do
  newl=${lin//&gt;/>}
  newl=${newl//&lt;/<}
  newl=${newl//&amp;/<}
  # ...other entites
  echo "$newl"
done

Il a probablement besoin de bash> = version 4

bobom
la source