Bagaimana saya dapat dengan mudah mengkonversi entitas khusus HTML dari aliran input standar di Linux?

9

CentOS

Apakah ada cara mudah untuk mengonversi entitas khusus HTML dari aliran data? Saya meneruskan data ke skrip bash dan terkadang data itu mencakup entitas khusus. Sebagai contoh:

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

Saya tidak yakin mengapa beberapa karakter muncul dengan baik dan yang lainnya tidak, tetapi sayangnya, saya tidak memiliki kendali atas data yang masuk.

Saya pikir saya mungkin bisa menggunakan SED di sini tapi sepertinya itu akan menjadi rumit dan mungkin rentan terhadap positif palsu. Apakah ada perintah Linux yang bisa saya gunakan untuk melakukan spesialisasi dalam decoding tipe data ini?

Mike B
sumber

Jawaban:

9

PHP sangat cocok untuk ini. Contoh ini membutuhkan PHP 5:

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

Perl adalah (seperti biasa) teman Anda. Saya pikir ini akan melakukannya:

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

Misalnya:

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

Dengan output:

someguy@somehost ~]$ echo '"test" & test $test ! test @ # $ % ^ & *' |perl -n -mHTML::Entities -e ' ; print HTML::Entities::decode_entities($_) ;'
"test" & test $test ! test @ # $ % ^ & *
Jason Tan
sumber
Ini berfungsi pada laptop OSX10.8 saya dan host RHEL5.something.
Jason Tan
Untuk menampilkan file dalam UTF-8, gunakan binmode: echo "& laquo;" | perl -n -mHTML :: Entitas -mutf8 -e 'binmode (STDOUT, ": utf8"); cetak HTML :: Entities :: decode_entities ($ _); '
Falstaff
6

recode tampaknya tersedia di repositori paket-paket default dari distribusi GNU / Linux utama. Misalnya untuk mendekode entitas HTML ke UTF-8:

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

Dengan Python 3:

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

Mengambil file teks dari stdin:

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

Mungkin perlu bash> = versi 4

bobom
sumber