Bash скрипт для преобразования из HTML-сущностей в символы - PullRequest
56 голосов
/ 08 мая 2011

Я ищу способ повернуть это:

hello < world

к этому:

hello < world

Я мог бы использовать sed, но как это сделать без использования загадочного регулярного выражения?

Ответы [ 6 ]

78 голосов
/ 08 мая 2011

Попробуйте перекодировать ( заархивированная страница ; Зеркало GitHub ; Страница Debian ):

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

Установитьв Linux и аналогичных системах Unix-y:

$ sudo apt-get install recode

Установить в Mac OS с помощью:

$ brew install recode
42 голосов
/ 31 октября 2012

с perl:

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

С php из командной строки:

cat foo.html | php -r 'while(($line=fgets(STDIN)) !== FALSE) echo html_entity_decode($line, ENT_QUOTES|ENT_HTML401);'
18 голосов
/ 26 мая 2011

Альтернативой является передача через веб-браузер, например:

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

Это прекрасно сработало для меня в cygwin, где загрузка и установка дистрибутивов затруднительны.

Этот ответ был найден здесь

15 голосов
/ 09 мая 2011

Использование xmlstarlet:

echo 'hello &lt; world' | xmlstarlet unesc
9 голосов
/ 28 марта 2017

Этот ответ основан на: Коротком способе избежать HTML в Bash? , который отлично подходит для получения ответов (используя wget) на Stack Exchange и преобразования HTML в обычные символы ASCII:

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;'

Редактировать 1: 7 апреля 2017 г. - Добавлена ​​конвертация левой двойной кавычки и правой двойной кавычки.Это часть bash-скрипта, который веб-утилиты отбрасывает ответы SE и сравнивает их с локальными файлами кода здесь: Ask Ubuntu - Контроль версий кода между локальными файлами и Ask Ubuntu отвечает


Редактировать26 июня 2017 г.

Использование sed заняло ~ 3 секунды для преобразования HTML в ASCII для файла строки размером 1 КБ из Ask Ubuntu / Stack Exchange.В связи с этим я был вынужден использовать встроенный поиск Bash и заменить его на ~ 1 секунду времени отклика.

Вот функция:

#-------------------------------------------------------------------------------
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 ()
3 голосов
/ 08 марта 2017

Версия Python 3.2+:

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