Bash中转义HTML的捷径



该框没有Ruby/Python/Perl等

只有bashsedawk

一种方法是用映射替换字符,但这会变得乏味。

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

转义HTML实际上只需要替换三个字符:<>&。对于额外的点数,您也可以替换"'。所以,这不是一个很长的sed脚本:

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

您可以使用recode实用程序:

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

输出:

He said: &quot;Not sure that - 2&lt;1&quot;

纯bash,无外部程序:

function htmlEscape () {
local s
s=${1//&/&amp;}
s=${s//</&lt;}
s=${s//>/&gt;}
s=${s//'"'/&quot;}
printf -- %s "$s"
}

只是简单的字符串替换。

或使用xmlstar Escape/Unescape特殊XML字符:

$ echo '<abc&def>'| xml esc
&lt;abc&amp;def&gt;

我使用的是jq:

$ echo "2 < 4 is 'TRUE'" | jq -Rr @html
2 &lt; 4 is &apos;TRUE&apos;

这是对miken32"纯粹的狂欢,">没有外部程序":

bash 5.2以非常不方便的方式破坏了向后兼容性。

来自新闻:

x。新的shell选项:patsub_replacement。启用时,将显示"&"在里面模式替换展开的替换字符串为替换为字符串中与模式匹配的部分。Backslash将退出"&"并插入文字"&"。

默认情况下,该选项处于启用状态。如果要恢复以前的行为,添加shopt-u patsub_replacement

因此有三种方法可以在bash 5.2+中使用miken32代码:

禁用patsub_replacement:

shopt -u patsub_replacement
function htmlEscape () {
local s
s=${1//&/&amp;}
s=${s//</&lt;}
s=${s//>/&gt;}
s=${s//'"'/&quot;}
printf -- %s "$s"
}

,另一种选择是转义"&"如果您想让它在不考虑5.2功能的情况下工作,请在替换中使用反斜杠,patsub_replacement

function htmlEscape () {
local s
s=${1//&/&amp;}
s=${s//</&lt;}
s=${s//>/&gt;}
s=${s//'"'/&quot;}
printf -- %s "$s"
}

另一种选择是在替换中引用字符串:

function htmlEscape () {
local s
s=${1//&/"&amp;"}
s=${s//</"&lt;"}
s=${s//>/"&gt;"}
s=${s//'"'/"&quot;"}
printf -- %s "$s"
}

有更好的答案,但我刚刚发现了这个,所以我想分享一下。

PN=`basename "$0"`          # Program name
VER=`echo '$Revision: 1.1 $' | cut -d' ' -f2`
Usage () {
echo >&2 "$PN - encode HTML unsave characters, $VER
usage: $PN [file ...]"
exit 1
}
set -- `getopt h "$@"`
while [ $# -gt 0 ]
do
case "$1" in
--) shift; break;;
-h) Usage;;
-*) Usage;;
*)  break;;         # First file name
esac
shift
done
sed                                     
-e 's/&/&amp;/g'                       
-e 's/"/&quot;/g'                      
-e 's/</&lt;/g'                        
-e 's/>/&gt;/g'                        
-e 's/„/&auml;/g'                      
-e 's/Ž/&Auml;/g'                      
-e 's/”/&ouml;/g'                      
-e 's/™/&Ouml;/g'                      
-e 's//&uuml;/g'                       
-e 's/š/&Uuml;/g'                      
-e 's/á/&szlig;/g'                     
"$@"

之前的sed替换破坏了等有效输出

&lt;

进入

&amp;lt;

在前面添加一个否定的loook,这样"&"只会变为"&",如果"&"后面还没有"amp;"修复:

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

相关内容

  • 没有找到相关文章

最新更新