15

CentOS

Is there an easy way to convert HTML special entities from a data stream? I'm passing data to a bash script and sometimes that data includes special entities. For example:

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

I'm not sure why some characters show up fine and other don't but unfortunately, I don't have control over the data coming in.

I'm thinking I might be able to use SED here but that seems like it would be cumbersome and possibly prone to false positives. Is there a Linux command I could pipe to that specializes in decoding this type of data?

6 Answers 6

10

PHP is well suited to this. This example requires PHP 5:

cat file.html | php -R 'echo html_entity_decode($argn);'
1
  • 1
    This command strips the new lines from my output, which is not wanted in some cases. May 28, 2020 at 18:11
14

Perl is (as always) your friend. I think this will do it:

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

E.g.:

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

With output:

someguy@somehost ~]$ echo '"test" & test $test ! test @ # $ % ^ & *' |perl -n -mHTML::Entities -e ' ; print HTML::Entities::decode_entities($_) ;'
"test" & test $test ! test @ # $ % ^ & *
2
  • This works on my OSX10.8 laptop and a RHEL5.something host.
    – Jason Tan
    Oct 22, 2012 at 5:52
  • 1
    In order to output the file in UTF-8, use binmode: echo "«" | perl -n -mHTML::Entities -mutf8 -e 'binmode(STDOUT, ":utf8"); print HTML::Entities::decode_entities($_) ;'
    – falstaff
    Nov 23, 2013 at 22:46
11

recode seems available on default packages repositories of main GNU/Linux distributions. E.g. to decode HTML entities into UTF-8 :

…|recode html..utf8

Edit : The initial repo looks unmaintained, a more up-to-date fork can be found here.

3
  • unfortunately this messes up UTF-8 (e.g. zero-width spaces...)
    – ciis0
    Mar 26 at 11:17
  • @ciis0 See my edit, does it happen with the fork ? If so, it might be worth filing an issue on gitlab. Not sure which version is implemented in standard distributions, though, I wouldn’t be surprised it’s still the initial version. Mar 26 at 11:45
  • seems to be the initial one; I used apt install recode on Ubuntu 22.04.
    – ciis0
    Mar 26 at 12:04
5

With Python 3:

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

Takes text file from stdin:

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

It probably needs bash >= version 4

0

I use this script. Save it as html2utf.py, and use it ala echo $some_html | html2utf.py.

#!/usr/bin/env python3
"""
An alternative for `perl -Mopen=locale -MHTML::Entities -pe '$_ = decode_entities($_)'` (which you can use by `cpanm HTML::Entities`) and `recode html..`.
"""

import fileinput
import html

for line in fileinput.input():
    print(html.unescape(line.rstrip('\n')))

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .