Como converter facilmente entidades especiais HTML de um fluxo de entrada padrão no Linux?

9

CentOS

Existe uma maneira fácil de converter entidades especiais HTML de um fluxo de dados? Estou passando dados para um script bash e, às vezes, esses dados incluem entidades especiais. Por exemplo:

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

Não sei por que alguns caracteres aparecem bem e outros não, mas infelizmente não tenho controle sobre os dados recebidos.

Acho que posso usar o SED aqui, mas isso parece complicado e possivelmente propenso a falsos positivos. Existe um comando do Linux para o qual eu possa canalizar que é especializado em decodificar esse tipo de dados?

Mike B
fonte

Respostas:

9

PHP é bem adequado para isso. Este exemplo requer PHP 5:

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

Perl é (como sempre) seu amigo. Eu acho que isso fará isso:

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

Por exemplo:

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

Com saída:

someguy@somehost ~]$ echo '"test" & test $test ! test @ # $ % ^ & *' |perl -n -mHTML::Entities -e ' ; print HTML::Entities::decode_entities($_) ;'
"test" & test $test ! test @ # $ % ^ & *
Jason Tan
fonte
Isso funciona no meu laptop OSX10.8 e no host RHEL5.something.
Jason Tan
Para gerar o arquivo em UTF-8, use binmode: echo "& laquo;" | perl -n -mHTML :: Entities -mutf8 -e 'binmode (STDOUT, ": utf8"); print HTML :: Entities :: decode_entities ($ _); '
falstaff
6

recode parece disponível em repositórios de pacotes padrão das principais distribuições GNU / Linux. Por exemplo, para decodificar entidades HTML em UTF-8:

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

Com o Python 3:

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

Retorna o arquivo de texto do stdin:

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

Provavelmente precisa do bash> = versão 4

bobom
fonte