Bash脚本将HTML实体转换为字符

我正在寻找一种方法来打开这个:

hello < world 

对此:

 hello < world 

我可以使用sed,但是如何在不使用神秘正则expression式的情况下完成呢?

尝试重新编码 ( 存档页面 ; GitHub镜像 ; Debian页面 ):

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

在Linux和类似的Unix-y系统上安装:

 $ sudo apt-get install recode 

在Mac OS上安装使用:

 $ brew install recode 

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

另一种方法是通过网页浏览器进行pipe道操作,例如:

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

这在cygwin中非常适合我,在那里下载和安装发行版很困难。

这个答案在这里find

使用xmlstarlet:

 echo 'hello &lt; world' | xmlstarlet unesc 

这个答案是基于: 在Bash中转义HTML的简短方法? 在Stack Exchange上抓取答案(使用wget )并将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: 2017年4月7日 – 增加了左双引号和右双引号转换。 这是bash脚本的一部分,web-scrapes SE回答并将它们与本地代码文件进行比较: 请求Ubuntu – 本地文件之间的代码版本控制并询问Ubuntu的答案


编辑2017年6月26日

在Ask Ubuntu / Stack Exchange的1K行文件中,使用sed需要花费大约3秒的时间将HTML转换为ASCII。 因此,我不得不使用Bash内置search,并取代〜1秒的响应时间。

这个function:

 #------------------------------------------------------------------------------- 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 () 

一个Python 3.2+版本:

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