Wie kann ich HTML-Spezialentitäten einfach aus einem Standardeingabestream unter Linux konvertieren?

9

CentOS

Gibt es eine einfache Möglichkeit, spezielle HTML-Entitäten aus einem Datenstrom zu konvertieren? Ich übergebe Daten an ein Bash-Skript und manchmal enthalten diese Daten spezielle Entitäten. Zum Beispiel:

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

Ich bin mir nicht sicher, warum einige Zeichen gut angezeigt werden und andere nicht, aber leider habe ich keine Kontrolle über die eingehenden Daten.

Ich denke, ich könnte SED hier verwenden, aber das scheint umständlich und möglicherweise anfällig für Fehlalarme zu sein. Gibt es einen Linux-Befehl, an den ich weiterleiten kann und der sich auf das Dekodieren dieser Art von Daten spezialisiert hat?

Mike B.
quelle

Antworten:

9

PHP ist dafür gut geeignet. Dieses Beispiel erfordert PHP 5:

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

Perl ist (wie immer) dein Freund. Ich denke, das wird es tun:

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

Z.B:

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

Mit Ausgabe:

someguy@somehost ~]$ echo '"test" & test $test ! test @ # $ % ^ & *' |perl -n -mHTML::Entities -e ' ; print HTML::Entities::decode_entities($_) ;'
"test" & test $test ! test @ # $ % ^ & *
Jason Tan
quelle
Dies funktioniert auf meinem OSX10.8-Laptop und einem RHEL5-Host.
Jason Tan
Verwenden Sie binmode: echo "& laquo;", um die Datei in UTF-8 auszugeben. | perl -n -mHTML :: Entities -mutf8 -e 'binmode (STDOUT, ": utf8"); print HTML :: Entities :: decode_entities ($ _); '
Falstaff
6

recode scheint in Standardpaket-Repositorys der wichtigsten GNU / Linux-Distributionen verfügbar zu sein. Zum Beispiel, um HTML-Entitäten in UTF-8 zu dekodieren:

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

Mit Python 3:

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

Nimmt Textdatei von stdin:

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

Es braucht wahrscheinlich bash> = Version 4

Bobom
quelle