Bash脚本将HTML实体转换为字符
我正在寻找一种方法来打开这个:
hello < world
对此:
hello < world
我可以使用sed,但是如何在不使用神秘正则expression式的情况下完成呢?
尝试重新编码 ( 存档页面 ; GitHub镜像 ; Debian页面 ):
$ echo '<' |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 '!' | w3m -dump -T text/html
这在cygwin中非常适合我,在那里下载和安装发行版很困难。
这个答案在这里find
使用xmlstarlet:
echo 'hello < world' | xmlstarlet unesc
这个答案是基于: 在Bash中转义HTML的简短方法? 在Stack Exchange上抓取答案(使用wget
)并将HTML转换为常规的ASCII字符时工作正常:
sed 's/ / /g; s/&/\&/g; s/</\</g; s/>/\>/g; s/"/\"/g; s/#'/\'"'"'/g; s/“/\"/g; s/”/\"/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/&/\&/g; s/</\</g; # s/>/\>/g; s/"/\"/g; s/'/\'"'"'/g; s/“/\"/g; # s/”/\"/g;' <<< "$Line") -- With faster builtin commands. LineOut="${LineOut// / }" LineOut="${LineOut//&/&}" LineOut="${LineOut//</<}" LineOut="${LineOut//>/>}" LineOut="${LineOut//"/'"'}" LineOut="${LineOut//'/"'"}" LineOut="${LineOut//“/'"'}" # TODO: ASCII/ISO for opening quote LineOut="${LineOut//”/'"'}" # 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]'