Jak mogę łatwo przekonwertować specjalne jednostki HTML ze standardowego strumienia wejściowego w systemie Linux?

9

CentOS

Czy istnieje prosty sposób na konwersję specjalnych jednostek HTML ze strumienia danych? Przesyłam dane do skryptu bash, a czasem dane te zawierają specjalne byty. Na przykład:

„test” i amp; test $ test! test @ # $% ^ & amp; *

Nie jestem pewien, dlaczego niektóre postacie pokazują się dobrze, a inne nie, ale niestety nie mam kontroli nad napływającymi danymi.

Myślę, że mogę tu użyć SED, ale wydaje się, że byłoby to uciążliwe i prawdopodobnie podatne na fałszywe alarmy. Czy istnieje polecenie dla Linuksa, które specjalizuje się w dekodowaniu tego typu danych?

Mike B.
źródło

Odpowiedzi:

9

PHP jest do tego dobrze dostosowane. Ten przykład wymaga PHP 5:

cat file.html | php -R 'echo html_entity_decode($argn);'
Michael Hampton
źródło
14

Perl jest (jak zawsze) twoim przyjacielem. Myślę, że to zrobi:

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

Na przykład:

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

Z wyjściem:

someguy@somehost ~]$ echo '"test" & test $test ! test @ # $ % ^ & *' |perl -n -mHTML::Entities -e ' ; print HTML::Entities::decode_entities($_) ;'
"test" & test $test ! test @ # $ % ^ & *
Jason Tan
źródło
Działa to na moim laptopie OSX10.8 i hoście RHEL5.something.
Jason Tan,
Aby wydrukować plik w UTF-8, użyj binmode: echo "& laquo;" | perl -n -mHTML :: Entities -mutf8 -e 'binmode (STDOUT, ": utf8"); drukuj HTML :: Encje :: decode_entities ($ _); '
falstaff
6

recode wydaje się dostępne w domyślnych repozytoriach pakietów głównych dystrybucji GNU / Linux. Np. Aby zdekodować encje HTML do UTF-8:

…|recode html..utf8
Skippy le Grand Gourou
źródło
2

Z Python 3:

python3 -c 'import html,sys; print(html.unescape(sys.stdin.read()), end="")' < file.html
ariddell
źródło
0

Pobiera plik tekstowy ze standardowego wejścia:

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

Prawdopodobnie wymaga bash> = wersja 4

bobom
źródło