¿Cómo puedo convertir fácilmente entidades especiales HTML de una secuencia de entrada estándar en Linux?

9

CentOS

¿Hay una manera fácil de convertir entidades especiales HTML de un flujo de datos? Estoy pasando datos a un script bash y, a veces, esos datos incluyen entidades especiales. Por ejemplo:

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

No estoy seguro de por qué algunos caracteres aparecen bien y otros no, pero desafortunadamente no tengo control sobre los datos que ingresan.

Estoy pensando que podría usar SED aquí, pero parece que sería engorroso y posiblemente propenso a falsos positivos. ¿Hay algún comando de Linux al que pueda canalizar que se especialice en decodificar este tipo de datos?

Mike B
fuente

Respuestas:

9

PHP se adapta bien a esto. Este ejemplo requiere PHP 5:

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

Perl es (como siempre) tu amigo. Creo que esto lo hará:

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

P.ej:

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

Con salida:

someguy@somehost ~]$ echo '"test" & test $test ! test @ # $ % ^ & *' |perl -n -mHTML::Entities -e ' ; print HTML::Entities::decode_entities($_) ;'
"test" & test $test ! test @ # $ % ^ & *
Jason Tan
fuente
Esto funciona en mi computadora portátil OSX10.8 y un host RHEL5.something.
Jason Tan
Para generar el archivo en UTF-8, use binmode: echo "& laquo;" El | perl -n -mHTML :: Entidades -mutf8 -e 'binmode (STDOUT, ": utf8"); print HTML :: Entities :: decode_entities ($ _); '
falstaff
6

recode parece estar disponible en repositorios de paquetes predeterminados de las principales distribuciones de GNU / Linux. Por ejemplo, para decodificar entidades HTML en UTF-8:

…|recode html..utf8
Skippy le Grand Gourou
fuente
2

Con Python 3:

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

Toma el archivo de texto de stdin:

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

Probablemente necesite bash> = versión 4

bobom
fuente