web-dev-qa-db-fra.com

Script Bash pour convertir des entités HTML en caractères

Je cherche un moyen de transformer cela:

hello < world

pour ça:

hello < world

Je pourrais utiliser sed, mais comment cela peut-il être accompli sans utiliser d'expression régulière cryptique?

56
Marko

Essayez recoder ( page archivée ; miroir GitHub ; page Debian ):

$ echo '&lt;' |recode html..ascii
<

Installez sur Linux et les systèmes Unix-y similaires:

$ Sudo apt-get install recode

Installez sur Mac OS en utilisant:

$ brew install recode
79
ceving

Avec Perl:

cat foo.html | Perl -MHTML::Entities -pe 'decode_entities($_);'

Avec php depuis la ligne de commande:

cat foo.html | php -r 'while(($line=fgets(STDIN)) !== FALSE) echo html_entity_decode($line, ENT_QUOTES|ENT_HTML401);'
44
user1788934

Une alternative consiste à passer par un navigateur Web, tel que:

echo '&#33;' | w3m -dump -T text/html

Cela a très bien fonctionné pour moi à cygwin, où le téléchargement et l'installation des distributions sont difficiles.

Cette réponse a été trouvée ici

18
Whitecat

Utilisation de xmlstarlet:

echo 'hello &lt; world' | xmlstarlet unesc
16
user243

Cette réponse est basée sur: n moyen court pour échapper au HTML dans Bash? qui fonctionne très bien pour récupérer les réponses (en utilisant wget) sur Stack Exchange et convertir le HTML en normal ASCII caractères:

sed 's/&nbsp;/ /g; s/&amp;/\&/g; s/&lt;/\</g; s/&gt;/\>/g; s/&quot;/\"/g; s/#&#39;/\'"'"'/g; s/&ldquo;/\"/g; s/&rdquo;/\"/g;'

Édition 1: 7 avril 2017 - Ajout d'une conversion de guillemet double gauche et de guillemet double droit. Cela fait partie du script bash qui gratte les réponses SE sur le Web et les compare aux fichiers de code locaux ici: Ask Ubuntu - Code Version Control entre les fichiers locaux et Ask Ubuntu answers


Modifier le 26 juin 2017

L'utilisation de sed prenait environ 3 secondes pour convertir le HTML en ASCII sur un fichier de ligne de 1 Ko à partir de Ask Ubuntu/Stack Exchange. En tant que tel, j'ai été obligé d'utiliser la recherche intégrée de Bash et remplacer pendant ~ 1 seconde de temps de réponse.

Voici la fonction:

#-------------------------------------------------------------------------------
LineOut=""      # Make global
HTMLtoText () {
    LineOut=$1  # Parm 1= Input line
    # Replace external command: Line=$(sed 's/&amp;/\&/g; s/&lt;/\</g; 
    # s/&gt;/\>/g; s/&quot;/\"/g; s/&#39;/\'"'"'/g; s/&ldquo;/\"/g; 
    # s/&rdquo;/\"/g;' <<< "$Line") -- With faster builtin commands.
    LineOut="${LineOut//&nbsp;/ }"
    LineOut="${LineOut//&amp;/&}"
    LineOut="${LineOut//&lt;/<}"
    LineOut="${LineOut//&gt;/>}"
    LineOut="${LineOut//&quot;/'"'}"
    LineOut="${LineOut//&#39;/"'"}"
    LineOut="${LineOut//&ldquo;/'"'}" # TODO: ASCII/ISO for opening quote
    LineOut="${LineOut//&rdquo;/'"'}" # TODO: ASCII/ISO for closing quote
} # HTMLtoText ()
8
WinEunuuchs2Unix

Une version python 3.2+:

cat foo.html | python3 -c 'import html, sys; [print(html.unescape(l), end="") for l in sys.stdin]'
4
Aissen