在Bash中转义HTML的捷径?

在Bash中转义HTML的捷径?,bash,html-entities,Bash,Html Entities,该框没有Ruby/Python/Perl等 只有bash、sed和awk 一种方法是用map替换char,但它会变得单调乏味 也许有些我不知道的内置功能?转义HTML实际上只需要替换三个字符:,和&。对于额外的要点,您还可以替换“和”。因此,它不是一个长的sed脚本: sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g; s/"/\&quot;/g; s/'"'"'/\&#39;/g' sed's/

该框没有Ruby/Python/Perl等

只有
bash
sed
awk

一种方法是用map替换char,但它会变得单调乏味


也许有些我不知道的内置功能?

转义HTML实际上只需要替换三个字符:
,和
&
。对于额外的要点,您还可以替换
。因此,它不是一个长的
sed
脚本:

sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g; s/"/\&quot;/g; s/'"'"'/\&#39;/g'
sed's/&/\&;/g;s/\/g;s/“/\”/g;s/'''''/\&&39;/g'

以前的sed替换会损坏有效输出,如

&lt;
进入

在前面添加一个负数loook,使“&”仅更改为“&;“如果那”&“后面还没有”amp;“修正如下:

sed 's/&(?!amp;)/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g; s/"/\&quot;/g; s/'"'"'/\&#39;/g'
sed's/&(?!amp;)/\&;/g;s/\/g;s/“/\”/g;s/''''''''/\&&39;/g'

您可以使用
重新编码
实用程序:

    echo 'He said: "Not sure that - 2<1"' | recode ascii..html

纯bash,无外部程序:

function htmlEscape () {
    local s
    s=${1//&/&amp;}
    s=${s//</&lt;}
    s=${s//>/&gt;}
    s=${s//'"'/&quot;}
    printf -- %s "$s"
}
函数htmlEscape(){
当地居民
s=${1/&/&;}
s=${s//}
s=${s/'''/''}
printf--%s“$s”
}
只需简单的字符串替换。

或使用xmlstar:

$echo'| xml esc
abc&def

大错特错。当我用HTML编码字符串
&;
时,这是因为我想让某些web浏览器将其呈现为
&;
。这就是为什么必须将其转换为
&;
。这样,HTML编码和HTML解码是平衡的。您不会因为输入看起来已经存在而抑制HTML编码HTML编码。HTML编码不是幂等的。如果不理解,最终会导致XSS漏洞。@Ruud是对的;正确的方法是首先逃过符号,就像ruakh的回答中那样。我完全同意@Ruud所说的,除了他应该强调不理解会导致XSS漏洞Probab如果没有Python/Ruby/Perl,则无法使用。在30个左右包含ASCII的文本文件上测试,它甚至可以处理空字符
\0
。用于沙箱文本文件内容,用于沙箱HTML中沙箱
iframe
属性,并允许通过父框架层叠背景样式。+1用于优雅和高效。你应该在这里发布你的答案:他们建议在哪里安装
recode
perl
php
xmlsarlet
w3m
(一种大声叫喊的网络浏览器)。最后一个答案建议使用Python3,尽管它是默认安装的(至少在Ubuntu中)太过分了。@wineunuchs2unix:谢谢你的客气话!这个问题的方向正好相反(
@ruakh不客气:)您的sed搜索和替换不能简单地反转以获得与这些答案相同的结果吗?@wineunuchs2unix:HTML转义给定文本的方法有很多种;例如,
<;
&&60;
都是转义
的有效方法。我的HTML转义仅限于堆栈交换站点到目前为止,我只注意到
&Amp;
$lt;
。我们的目标是比较我在Ask Ubuntu中发布的驱动器上的所有脚本,看看它们是否在Ask Ubuntu中被本地更改或被其他人修改过。为了好玩,我还从HTML文件中提取upvotes并将其放在本地文件中。这是前几天晚上正在进行的工作:我想尝试一下,但不知道如何安装xml esc。我甚至不知道那是什么。如果您使用的是MacOS,您可以详细说明一下吗?只需
brew安装xmlstarlet
    He said: &quot;Not sure that - 2&lt;1&quot;
function htmlEscape () {
    local s
    s=${1//&/&amp;}
    s=${s//</&lt;}
    s=${s//>/&gt;}
    s=${s//'"'/&quot;}
    printf -- %s "$s"
}
$ echo '<abc&def>'| xml esc
&lt;abc&amp;def&gt;