我的脚本
/<script/{
: START;
s#</script>#&#;
t DEL;
: LOOP;
N;
s#</script>#&#;
t DEL;
b LOOP;
: DEL;
s#<script.*</script>##;
s#<script#&#;
t START;
}
将上述代码保存到deljs.sed文件中,使用以下命令调用:
sed -f deljs.sed demo.html
另外,如果不想使用sed脚本文件的形式,也可以将sed脚本中的代码写成一行,方便放到shell中,使用下述命令:
sed '/<script/{: START;s#</script>#&#;t DEL;: LOOP;N;s#</script>#&#; t DEL;b LOOP;: DEL;s#<script.*</script>##;s#<script#&#;t START;}' demo.html
脚本详解
参考自sed命令的man文档
/<script/{对字符串"<script"进行寻址,找到后执行一个命令块。
{:开始一个命令块(以}结尾)。: START;设置一个名为"START"的标签。
: label:用于b或t或T命令的标签。s#</script>#&#;执行替换命令,将字符串"</script>“替换为”</script>"。
s/regexp/replacement/:使用正则表达式regexp与模式空间进行匹配,如果匹配成功,替换为匹配的部分为replacement,replacement可能包含特殊字符&来代指模式空间中与之匹配的部分,或者转义字符\1到\9来代指正则表达式regexp中对应的匹配子表达式。t DEL;如果上述替换命令执行成功,跳转到名为"DEL"的标签处。
t label:如果自从读入当前行,并且自上一条t或T命令到现在,有一条s///替换命令执行成功,就跳转到指定的标签处,如果不指定标签,则跳转到脚本结束。
T label:与t label相反,如果没有s///替换命令执行成功,则跳转到指定的标签处。: LOOP;设置一个名为"LOOP"的标签。
N;将下一行加入模式空间。
n N:读取/追加下一行输入,到模式空间。s#</script>#&#;执行替换命令,将字符串"</script>“替换为”</script>"。
t DEL;如果上述替换命令执行成功,跳转到名为"DEL"的标签处。
b LOOP;跳转到名为"LOOP"的标签处。
b label:跳转到指定标签处,如果未指定标签,则跳转到脚本结束。: DEL;设置一个名为"DEL"的标签。
s#<script.*</script>##;执行替换命令,将正则表达式"<script.*</script>"匹配到的模式空间中的内容替换为空。
s#<script#&#;执行替换命令,将字符串"<script"替换为"<script"。
用于防止上一个标签对的</script>与下一个标签对的<script>在同一行的情况。t START;如果上述替换命令执行成功,跳转到名为"START"的标签处。
}结束一个命令块。
注意事项
-
上述方法只是删除了html中的所有<script>标签,并没有删除html中所有的js,因为js还可以直接内嵌到html的其他标签中,比如,引用自NotFoundObject大佬的一篇博客《js在HTML中的三种写法》原文链接:
<!--当鼠标点击图片时跳出弹窗显示1223--> <div class="img"> 单击事件: <img src="images/001.jpg" onclick="alert(1223)"></img> </div> -
如果html正文中存在<script>标签,同样会被删除。
3364

被折叠的 条评论
为什么被折叠?



