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

Mar*_*rko 56 html bash html-escape-characters

我正在寻找一种方法来解决这个问题:

hello < world
Run Code Online (Sandbox Code Playgroud)

对此:

hello < world
Run Code Online (Sandbox Code Playgroud)

我可以使用sed,但如何在不使用神秘的正则表达式的情况下实现这一目标?

cev*_*ing 81

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

$ echo '&lt;' |recode html..ascii
<
Run Code Online (Sandbox Code Playgroud)

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

$ sudo apt-get install recode
Run Code Online (Sandbox Code Playgroud)

在Mac OS上安装使用:

$ brew install recode
Run Code Online (Sandbox Code Playgroud)

  • 只需我2美分 - 我转换为UTF-8编码的XML,我使用:recode xml..utf8 (4认同)
  • `recode` 假设 HTML 采用 ISO-8859 编码,因此会破坏 UTF-8:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=748984 (4认同)
  • 适合 HTML 实体,但会搞乱表情符号:`echo '' | 重新编码 html..UTF-8` 给出 `ð`。Perl 方法保留它们。 (2认同)
  • @Hugo你告诉recode从HTML转换.表情符号不是HTML,它已经是unicode. (2认同)

小智 45

使用perl:

cat foo.html | perl -MHTML::Entities -pe 'decode_entities($_);'
Run Code Online (Sandbox Code Playgroud)

使用命令行中的php:

cat foo.html | php -r 'while(($line=fgets(STDIN)) !== FALSE) echo html_entity_decode($line, ENT_QUOTES|ENT_HTML401);'
Run Code Online (Sandbox Code Playgroud)

  • 更短的Perl版本:`perl -MHTML :: Entities -pe'sincode_entities($ _);'` (9认同)
  • 使用`perl -C -MHTML :: Entities -pe'sincode_entities($ _);' <foo.html`输出UTF-8(参见[this question](http://stackoverflow.com/questions/627661/how-can-i-output-utf-8-from-perl)) (7认同)
  • 如果你删除无用的猫(https://en.wikipedia.org/wiki/Cat_(Unix)#Useless_use_of_cat),我会给你一个upvote :-) (5认同)
  • “猫没用”的评论是考虑不周的。例如,被谴责的用户可能一直在做类似“zcat FILE.gz |”的事情。&lt;intricate_command&gt; 仅在当前行之前有两个命令行,而 'gunzip FILE.gz' 在当前行之前有一个命令行。有了历史记录和 readline,该用户现在可以按 UPARROW 两次,然后按 HOME,删除一个字符(“z”),然后按 ENTER 来运行“猫无用”质问者所憎恶的命令。因此:“猫没用”的评论往往与其说是热心,不如说是无能。 (4认同)
  • PHP版本不适用于某些字符,例如`&nbsp;` (2认同)

Whi*_*cat 18

另一种方法是通过Web浏览器进行管道传输 - 例如:

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

这在cygwin中对我很有用,因为下载和安装发行版很困难.

这个答案在这里找到


小智 16

使用xmlstarlet:

echo 'hello &lt; world' | xmlstarlet unesc
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这不适用于像`&#x3a;`这样的hexa实体. (6认同)
  • 对于“ (2认同)

Win*_*nix 10

这个答案基于:在Bash中逃避HTML的简短方法?这适用于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;'
Run Code Online (Sandbox Code Playgroud)

编辑1: 2017年4月7日 - 添加了左双引号和右双引号转换.这是bash脚本的一部分,网络擦除SE答案并将它们与本地代码文件进行比较:询问Ubuntu - 本地文件之间的代码版本控制和Ask Ubuntu答案


编辑2017年6月26日

sed在Ask Ubuntu/Stack Exchange的1K行文件中使用~3秒将HTML转换为ASCII.因此我被迫使用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 ()
Run Code Online (Sandbox Code Playgroud)


Ais*_*sen 7

python 3.2+版本:

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


Min*_*yễn 6

在 macOS 上,您可以使用内置命令textutil(通常来说这是一个方便的实用程序):

echo '&#128075; hello &lt; world &#x1f310;' | textutil -convert txt -format html -stdin -stdout
Run Code Online (Sandbox Code Playgroud)

输出:

 hello < world 
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您可能需要向“textutil”提供有关输入编码的提示才能使其正常工作。例如 `echo "здравствуйте &lt; мир" | textutil-转换txt-格式html-stdin-stdout-inputencoding 4` (2认同)